annotate clang/utils/analyzer/SATest.py @ 225:f7655407a6ba

remove unnecessary files
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 19 Jul 2021 03:48:36 +0900
parents 2e18cbf3894f
children c4bab56944e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 #!/usr/bin/env python
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 import argparse
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 import sys
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 import os
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 from subprocess import call
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 SCRIPTS_DIR = os.path.dirname(os.path.realpath(__file__))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 PROJECTS_DIR = os.path.join(SCRIPTS_DIR, "projects")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 DEFAULT_LLVM_DIR = os.path.realpath(os.path.join(SCRIPTS_DIR,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 os.path.pardir,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 os.path.pardir,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 os.path.pardir))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 def add(parser, args):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 import SATestAdd
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 from ProjectMap import ProjectInfo
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 if args.source == "git" and (args.origin == "" or args.commit == ""):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 parser.error(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 "Please provide both --origin and --commit if source is 'git'")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 if args.source != "git" and (args.origin != "" or args.commit != ""):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 parser.error("Options --origin and --commit don't make sense when "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 "source is not 'git'")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 project = ProjectInfo(args.name[0], args.mode, args.source, args.origin,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 args.commit)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 SATestAdd.add_new_project(project)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 def build(parser, args):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 import SATestBuild
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 SATestBuild.VERBOSE = args.verbose
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 projects = get_projects(parser, args)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 tester = SATestBuild.RegressionTester(args.jobs,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 projects,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 args.override_compiler,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 args.extra_analyzer_config,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 args.regenerate,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 args.strictness)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 tests_passed = tester.test_all()
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 if not tests_passed:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 sys.stderr.write("ERROR: Tests failed.\n")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 sys.exit(42)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 def compare(parser, args):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 import CmpRuns
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 choices = [CmpRuns.HistogramType.RELATIVE.value,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 CmpRuns.HistogramType.LOG_RELATIVE.value,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 CmpRuns.HistogramType.ABSOLUTE.value]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 if args.histogram is not None and args.histogram not in choices:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 parser.error("Incorrect histogram type, available choices are {}"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 .format(choices))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 dir_old = CmpRuns.ResultsDirectory(args.old[0], args.root_old)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 dir_new = CmpRuns.ResultsDirectory(args.new[0], args.root_new)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 CmpRuns.dump_scan_build_results_diff(dir_old, dir_new,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 show_stats=args.show_stats,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 stats_only=args.stats_only,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 histogram=args.histogram,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 verbose_log=args.verbose_log)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 def update(parser, args):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 import SATestUpdateDiffs
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 from ProjectMap import ProjectMap
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 project_map = ProjectMap()
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 for project in project_map.projects:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 SATestUpdateDiffs.update_reference_results(project, args.git)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 def benchmark(parser, args):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 from SATestBenchmark import Benchmark
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 projects = get_projects(parser, args)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 benchmark = Benchmark(projects, args.iterations, args.output)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 benchmark.run()
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 def benchmark_compare(parser, args):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 import SATestBenchmark
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 SATestBenchmark.compare(args.old, args.new, args.output)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 def get_projects(parser, args):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 from ProjectMap import ProjectMap, Size
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 project_map = ProjectMap()
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 projects = project_map.projects
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 def filter_projects(projects, predicate, force=False):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 return [project.with_fields(enabled=(force or project.enabled) and
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 predicate(project))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 for project in projects]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 if args.projects:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 projects_arg = args.projects.split(",")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 available_projects = [project.name
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 for project in projects]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 # validate that given projects are present in the project map file
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 for manual_project in projects_arg:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 if manual_project not in available_projects:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 parser.error("Project '{project}' is not found in "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 "the project map file. Available projects are "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 "{all}.".format(project=manual_project,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 all=available_projects))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 projects = filter_projects(projects, lambda project:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 project.name in projects_arg,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 force=True)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
124
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 try:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 max_size = Size.from_str(args.max_size)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 except ValueError as e:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 parser.error("{}".format(e))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
129
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 projects = filter_projects(projects, lambda project:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 project.size <= max_size)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 return projects
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
134
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 def docker(parser, args):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 if len(args.rest) > 0:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 if args.rest[0] != "--":
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 parser.error("REST arguments should start with '--'")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 args.rest = args.rest[1:]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
141
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 if args.build_image:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 docker_build_image()
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 elif args.shell:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 docker_shell(args)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 else:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 sys.exit(docker_run(args, ' '.join(args.rest)))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
148
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
149
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 def docker_build_image():
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 sys.exit(call("docker build --tag satest-image {}".format(SCRIPTS_DIR),
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 shell=True))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
153
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
154
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 def docker_shell(args):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 try:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 # First we need to start the docker container in a waiting mode,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 # so it doesn't do anything, but most importantly keeps working
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 # while the shell session is in progress.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 docker_run(args, "--wait", "--detach")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 # Since the docker container is running, we can actually connect to it
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 call("docker exec -it satest bash", shell=True)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
163
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 except KeyboardInterrupt:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 pass
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
166
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 finally:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 docker_cleanup()
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
169
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
170
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 def docker_run(args, command, docker_args=""):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 try:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 return call("docker run --rm --name satest "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 "-v {llvm}:/llvm-project "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 "-v {build}:/build "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 "-v {clang}:/analyzer "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 "-v {scripts}:/scripts "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 "-v {projects}:/projects "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 "{docker_args} "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 "satest-image:latest {command}"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 .format(llvm=args.llvm_project_dir,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 build=args.build_dir,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 clang=args.clang_dir,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 scripts=SCRIPTS_DIR,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 projects=PROJECTS_DIR,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 docker_args=docker_args,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 command=command),
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 shell=True)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
189
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 except KeyboardInterrupt:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 docker_cleanup()
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
192
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
193
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 def docker_cleanup():
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 print("Please wait for docker to clean up")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 call("docker stop satest", shell=True)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
197
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
198
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 def main():
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 parser = argparse.ArgumentParser()
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 subparsers = parser.add_subparsers()
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
202
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 # add subcommand
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 add_parser = subparsers.add_parser(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 "add",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 help="Add a new project for the analyzer testing.")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 # TODO: Add an option not to build.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 # TODO: Set the path to the Repository directory.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 add_parser.add_argument("name", nargs=1, help="Name of the new project")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 add_parser.add_argument("--mode", action="store", default=1, type=int,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 choices=[0, 1, 2],
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 help="Build mode: 0 for single file project, "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 "1 for scan_build, "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
214 "2 for single file c++11 project")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 add_parser.add_argument("--source", action="store", default="script",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 choices=["script", "git", "zip"],
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 help="Source type of the new project: "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 "'git' for getting from git "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 "(please provide --origin and --commit), "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 "'zip' for unpacking source from a zip file, "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 "'script' for downloading source by running "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 "a custom script")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
223 add_parser.add_argument("--origin", action="store", default="",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 help="Origin link for a git repository")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 add_parser.add_argument("--commit", action="store", default="",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 help="Git hash for a commit to checkout")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
227 add_parser.set_defaults(func=add)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
228
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 # build subcommand
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
230 build_parser = subparsers.add_parser(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 "build",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 help="Build projects from the project map and compare results with "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
233 "the reference.")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 build_parser.add_argument("--strictness", dest="strictness",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 type=int, default=0,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
236 help="0 to fail on runtime errors, 1 to fail "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 "when the number of found bugs are different "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
238 "from the reference, 2 to fail on any "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
239 "difference from the reference. Default is 0.")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
240 build_parser.add_argument("-r", dest="regenerate", action="store_true",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
241 default=False,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
242 help="Regenerate reference output.")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
243 build_parser.add_argument("--override-compiler", action="store_true",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 default=False, help="Call scan-build with "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
245 "--override-compiler option.")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
246 build_parser.add_argument("-j", "--jobs", dest="jobs",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
247 type=int, default=0,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
248 help="Number of projects to test concurrently")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
249 build_parser.add_argument("--extra-analyzer-config",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
250 dest="extra_analyzer_config", type=str,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 default="",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
252 help="Arguments passed to to -analyzer-config")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
253 build_parser.add_argument("--projects", action="store", default="",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
254 help="Comma-separated list of projects to test")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
255 build_parser.add_argument("--max-size", action="store", default=None,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
256 help="Maximum size for the projects to test")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
257 build_parser.add_argument("-v", "--verbose", action="count", default=0)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
258 build_parser.set_defaults(func=build)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
259
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
260 # compare subcommand
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
261 cmp_parser = subparsers.add_parser(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
262 "compare",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
263 help="Comparing two static analyzer runs in terms of "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
264 "reported warnings and execution time statistics.")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
265 cmp_parser.add_argument("--root-old", dest="root_old",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
266 help="Prefix to ignore on source files for "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
267 "OLD directory",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
268 action="store", type=str, default="")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
269 cmp_parser.add_argument("--root-new", dest="root_new",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
270 help="Prefix to ignore on source files for "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
271 "NEW directory",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
272 action="store", type=str, default="")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
273 cmp_parser.add_argument("--verbose-log", dest="verbose_log",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
274 help="Write additional information to LOG "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
275 "[default=None]",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
276 action="store", type=str, default=None,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
277 metavar="LOG")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
278 cmp_parser.add_argument("--stats-only", action="store_true",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
279 dest="stats_only", default=False,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
280 help="Only show statistics on reports")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
281 cmp_parser.add_argument("--show-stats", action="store_true",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
282 dest="show_stats", default=False,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
283 help="Show change in statistics")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
284 cmp_parser.add_argument("--histogram", action="store", default=None,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
285 help="Show histogram of paths differences. "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
286 "Requires matplotlib")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
287 cmp_parser.add_argument("old", nargs=1, help="Directory with old results")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
288 cmp_parser.add_argument("new", nargs=1, help="Directory with new results")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
289 cmp_parser.set_defaults(func=compare)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
290
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
291 # update subcommand
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
292 upd_parser = subparsers.add_parser(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
293 "update",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
294 help="Update static analyzer reference results based on the previous "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
295 "run of SATest build. Assumes that SATest build was just run.")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
296 upd_parser.add_argument("--git", action="store_true",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
297 help="Stage updated results using git.")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
298 upd_parser.set_defaults(func=update)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
299
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
300 # docker subcommand
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
301 dock_parser = subparsers.add_parser(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
302 "docker",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
303 help="Run regression system in the docker.")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
304
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
305 dock_parser.add_argument("--build-image", action="store_true",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
306 help="Build docker image for running tests.")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
307 dock_parser.add_argument("--shell", action="store_true",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
308 help="Start a shell on docker.")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
309 dock_parser.add_argument("--llvm-project-dir", action="store",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
310 default=DEFAULT_LLVM_DIR,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
311 help="Path to LLVM source code. Defaults "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
312 "to the repo where this script is located. ")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
313 dock_parser.add_argument("--build-dir", action="store", default="",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
314 help="Path to a directory where docker should "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
315 "build LLVM code.")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
316 dock_parser.add_argument("--clang-dir", action="store", default="",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
317 help="Path to find/install LLVM installation.")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
318 dock_parser.add_argument("rest", nargs=argparse.REMAINDER, default=[],
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
319 help="Additionall args that will be forwarded "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
320 "to the docker's entrypoint.")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
321 dock_parser.set_defaults(func=docker)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
322
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
323 # benchmark subcommand
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
324 bench_parser = subparsers.add_parser(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
325 "benchmark",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
326 help="Run benchmarks by building a set of projects multiple times.")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
327
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
328 bench_parser.add_argument("-i", "--iterations", action="store",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
329 type=int, default=20,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
330 help="Number of iterations for building each "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
331 "project.")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
332 bench_parser.add_argument("-o", "--output", action="store",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
333 default="benchmark.csv",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
334 help="Output csv file for the benchmark results")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
335 bench_parser.add_argument("--projects", action="store", default="",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
336 help="Comma-separated list of projects to test")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
337 bench_parser.add_argument("--max-size", action="store", default=None,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
338 help="Maximum size for the projects to test")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
339 bench_parser.set_defaults(func=benchmark)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
340
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
341 bench_subparsers = bench_parser.add_subparsers()
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
342 bench_compare_parser = bench_subparsers.add_parser(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
343 "compare",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
344 help="Compare benchmark runs.")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
345 bench_compare_parser.add_argument("--old", action="store", required=True,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
346 help="Benchmark reference results to "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
347 "compare agains.")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
348 bench_compare_parser.add_argument("--new", action="store", required=True,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
349 help="New benchmark results to check.")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
350 bench_compare_parser.add_argument("-o", "--output",
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
351 action="store", required=True,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
352 help="Output file for plots.")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
353 bench_compare_parser.set_defaults(func=benchmark_compare)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
354
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
355 args = parser.parse_args()
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
356 args.func(parser, args)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
357
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
358
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
359 if __name__ == "__main__":
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
360 main()