annotate gcc/optinfo-emit-json.cc @ 137:d22083d7f10b

merge
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 08 Nov 2018 14:16:42 +0900
parents 84e7813d76e9
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 /* Emit optimization information as JSON files.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 Copyright (C) 2018 Free Software Foundation, Inc.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3 Contributed by David Malcolm <dmalcolm@redhat.com>.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5 This file is part of GCC.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 GCC is free software; you can redistribute it and/or modify it under
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 the terms of the GNU General Public License as published by the Free
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 Software Foundation; either version 3, or (at your option) any later
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10 version.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15 for more details.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 along with GCC; see the file COPYING3. If not see
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19 <http://www.gnu.org/licenses/>. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21 #include "config.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 #include "system.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23 #include "coretypes.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 #include "backend.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 #include "tree.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 #include "gimple.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28 #include "diagnostic-core.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 #include "profile.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31 #include "output.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 #include "tree-pass.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34 #include "optinfo.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35 #include "optinfo-emit-json.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 #include "json.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 #include "pretty-print.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38 #include "tree-pretty-print.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39 #include "gimple-pretty-print.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40 #include "cgraph.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42 #include "langhooks.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 #include "version.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44 #include "context.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 #include "pass_manager.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46 #include "selftest.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47 #include "dump-context.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49 /* A class for writing out optimization records in JSON format. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 class optrecord_json_writer
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 optrecord_json_writer ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55 ~optrecord_json_writer ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56 void write () const;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 void add_record (const optinfo *optinfo);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58 void pop_scope ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60 void add_record (json::object *obj);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61 json::object *impl_location_to_json (dump_impl_location_t loc);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62 json::object *location_to_json (location_t loc);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 json::object *profile_count_to_json (profile_count count);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 json::string *get_id_value_for_pass (opt_pass *pass);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65 json::object *pass_to_json (opt_pass *pass);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66 json::value *inlining_chain_to_json (location_t loc);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67 json::object *optinfo_to_json (const optinfo *optinfo);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68 void add_pass_list (json::array *arr, opt_pass *pass);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70 private:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71 /* The root value for the JSON file.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72 Currently the JSON values are stored in memory, and flushed when the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73 compiler exits. It would probably be better to simply write out
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
74 the JSON as we go. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
75 json::array *m_root_tuple;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
76
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
77 /* The currently open scopes, for expressing nested optimization records. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
78 auto_vec<json::array *> m_scopes;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
79 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
80
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
81 /* optrecord_json_writer's ctor. Populate the top-level parts of the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
82 in-memory JSON representation. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
83
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
84 optrecord_json_writer::optrecord_json_writer ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
85 : m_root_tuple (NULL), m_scopes ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
86 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
87 m_root_tuple = new json::array ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
88
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
89 /* Populate with metadata; compare with toplev.c: print_version. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
90 json::object *metadata = new json::object ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
91 m_root_tuple->append (metadata);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
92 metadata->set ("format", new json::string ("1"));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
93 json::object *generator = new json::object ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
94 metadata->set ("generator", generator);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
95 generator->set ("name", new json::string (lang_hooks.name));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
96 generator->set ("pkgversion", new json::string (pkgversion_string));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
97 generator->set ("version", new json::string (version_string));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
98 /* TARGET_NAME is passed in by the Makefile. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
99 generator->set ("target", new json::string (TARGET_NAME));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
100
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
101 /* TODO: capture command-line?
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
102 see gen_producer_string in dwarf2out.c (currently static). */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
103
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
104 /* TODO: capture "any plugins?" flag (or the plugins themselves). */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
105
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
106 json::array *passes = new json::array ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
107 m_root_tuple->append (passes);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
108
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
109 /* Call add_pass_list for all of the pass lists. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
110 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
111 #define DEF_PASS_LIST(LIST) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
112 add_pass_list (passes, g->get_passes ()->LIST);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
113 GCC_PASS_LISTS
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
114 #undef DEF_PASS_LIST
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
115 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
116
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
117 json::array *records = new json::array ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
118 m_root_tuple->append (records);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
119
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
120 m_scopes.safe_push (records);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
121 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
122
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
123 /* optrecord_json_writer's ctor.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
124 Delete the in-memory JSON representation. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
125
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
126 optrecord_json_writer::~optrecord_json_writer ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
127 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
128 delete m_root_tuple;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
129 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
130
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
131 /* Choose an appropriate filename, and write the saved records to it. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
132
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
133 void
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
134 optrecord_json_writer::write () const
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
135 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
136 char *filename = concat (dump_base_name, ".opt-record.json", NULL);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
137 FILE *outfile = fopen (filename, "w");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
138 if (outfile)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
139 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
140 m_root_tuple->dump (outfile);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
141 fclose (outfile);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
142 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
143 else
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
144 error_at (UNKNOWN_LOCATION, "unable to write optimization records to %qs",
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
145 filename); // FIXME: more info?
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
146 free (filename);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
147 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
148
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
149 /* Add a record for OPTINFO to the queue of records to be written. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
150
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
151 void
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
152 optrecord_json_writer::add_record (const optinfo *optinfo)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
153 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
154 json::object *obj = optinfo_to_json (optinfo);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
155
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
156 add_record (obj);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
157
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
158 /* Potentially push the scope. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
159 if (optinfo->get_kind () == OPTINFO_KIND_SCOPE)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
160 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
161 json::array *children = new json::array ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
162 obj->set ("children", children);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
163 m_scopes.safe_push (children);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
164 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
165 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
166
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
167 /* Private methods of optrecord_json_writer. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
168
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
169 /* Add record OBJ to the the innermost scope. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
170
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
171 void
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
172 optrecord_json_writer::add_record (json::object *obj)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
173 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
174 /* Add to innermost scope. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
175 gcc_assert (m_scopes.length () > 0);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
176 m_scopes[m_scopes.length () - 1]->append (obj);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
177 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
178
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
179 /* Pop the innermost scope. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
180
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
181 void
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
182 optrecord_json_writer::pop_scope ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
183 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
184 m_scopes.pop ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
185 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
186
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
187 /* Create a JSON object representing LOC. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
188
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
189 json::object *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
190 optrecord_json_writer::impl_location_to_json (dump_impl_location_t loc)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
191 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
192 json::object *obj = new json::object ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
193 obj->set ("file", new json::string (loc.m_file));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
194 obj->set ("line", new json::number (loc.m_line));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
195 if (loc.m_function)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
196 obj->set ("function", new json::string (loc.m_function));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
197 return obj;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
198 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
199
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
200 /* Create a JSON object representing LOC. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
201
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
202 json::object *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
203 optrecord_json_writer::location_to_json (location_t loc)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
204 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
205 gcc_assert (LOCATION_LOCUS (loc) != UNKNOWN_LOCATION);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
206 expanded_location exploc = expand_location (loc);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
207 json::object *obj = new json::object ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
208 obj->set ("file", new json::string (exploc.file));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
209 obj->set ("line", new json::number (exploc.line));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
210 obj->set ("column", new json::number (exploc.column));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
211 return obj;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
212 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
213
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
214 /* Create a JSON object representing COUNT. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
215
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
216 json::object *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
217 optrecord_json_writer::profile_count_to_json (profile_count count)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
218 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
219 json::object *obj = new json::object ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
220 obj->set ("value", new json::number (count.to_gcov_type ()));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
221 obj->set ("quality",
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
222 new json::string (profile_quality_as_string (count.quality ())));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
223 return obj;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
224 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
225
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
226 /* Get a string for use when referring to PASS in the saved optimization
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
227 records. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
228
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
229 json::string *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
230 optrecord_json_writer::get_id_value_for_pass (opt_pass *pass)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
231 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
232 pretty_printer pp;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
233 /* this is host-dependent, but will be consistent for a given host. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
234 pp_pointer (&pp, static_cast<void *> (pass));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
235 return new json::string (pp_formatted_text (&pp));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
236 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
237
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
238 /* Create a JSON object representing PASS. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
239
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
240 json::object *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
241 optrecord_json_writer::pass_to_json (opt_pass *pass)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
242 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
243 json::object *obj = new json::object ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
244 const char *type = NULL;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
245 switch (pass->type)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
246 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
247 default:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
248 gcc_unreachable ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
249 case GIMPLE_PASS:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
250 type = "gimple";
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
251 break;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
252 case RTL_PASS:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
253 type = "rtl";
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
254 break;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
255 case SIMPLE_IPA_PASS:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
256 type = "simple_ipa";
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
257 break;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
258 case IPA_PASS:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
259 type = "ipa";
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
260 break;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
261 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
262 obj->set ("id", get_id_value_for_pass (pass));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
263 obj->set ("type", new json::string (type));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
264 obj->set ("name", new json::string (pass->name));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
265 /* Represent the optgroup flags as an array. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
266 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
267 json::array *optgroups = new json::array ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
268 obj->set ("optgroups", optgroups);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
269 for (const kv_pair<optgroup_flags_t> *optgroup = optgroup_options;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
270 optgroup->name != NULL; optgroup++)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
271 if (optgroup->value != OPTGROUP_ALL
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
272 && (pass->optinfo_flags & optgroup->value))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
273 optgroups->append (new json::string (optgroup->name));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
274 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
275 obj->set ("num", new json::number (pass->static_pass_number));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
276 return obj;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
277 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
278
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
279 /* Create a JSON array for LOC representing the chain of inlining
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
280 locations.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
281 Compare with lhd_print_error_function and cp_print_error_function. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
282
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
283 json::value *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
284 optrecord_json_writer::inlining_chain_to_json (location_t loc)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
285 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
286 json::array *array = new json::array ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
287
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
288 tree abstract_origin = LOCATION_BLOCK (loc);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
289
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
290 while (abstract_origin)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
291 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
292 location_t *locus;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
293 tree block = abstract_origin;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
294
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
295 locus = &BLOCK_SOURCE_LOCATION (block);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
296 tree fndecl = NULL;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
297 block = BLOCK_SUPERCONTEXT (block);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
298 while (block && TREE_CODE (block) == BLOCK
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
299 && BLOCK_ABSTRACT_ORIGIN (block))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
300 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
301 tree ao = BLOCK_ABSTRACT_ORIGIN (block);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
302 if (TREE_CODE (ao) == FUNCTION_DECL)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
303 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
304 fndecl = ao;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
305 break;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
306 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
307 else if (TREE_CODE (ao) != BLOCK)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
308 break;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
309
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
310 block = BLOCK_SUPERCONTEXT (block);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
311 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
312 if (fndecl)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
313 abstract_origin = block;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
314 else
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
315 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
316 while (block && TREE_CODE (block) == BLOCK)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
317 block = BLOCK_SUPERCONTEXT (block);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
318
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
319 if (block && TREE_CODE (block) == FUNCTION_DECL)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
320 fndecl = block;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
321 abstract_origin = NULL;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
322 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
323 if (fndecl)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
324 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
325 json::object *obj = new json::object ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
326 const char *printable_name
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
327 = lang_hooks.decl_printable_name (fndecl, 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
328 obj->set ("fndecl", new json::string (printable_name));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
329 if (LOCATION_LOCUS (*locus) != UNKNOWN_LOCATION)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
330 obj->set ("site", location_to_json (*locus));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
331 array->append (obj);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
332 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
333 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
334
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
335 return array;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
336 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
337
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
338 /* Create a JSON object representing OPTINFO. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
339
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
340 json::object *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
341 optrecord_json_writer::optinfo_to_json (const optinfo *optinfo)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
342 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
343 json::object *obj = new json::object ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
344
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
345 obj->set ("impl_location",
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
346 impl_location_to_json (optinfo->get_impl_location ()));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
347
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
348 const char *kind_str = optinfo_kind_to_string (optinfo->get_kind ());
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
349 obj->set ("kind", new json::string (kind_str));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
350 json::array *message = new json::array ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
351 obj->set ("message", message);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
352 for (unsigned i = 0; i < optinfo->num_items (); i++)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
353 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
354 const optinfo_item *item = optinfo->get_item (i);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
355 switch (item->get_kind ())
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
356 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
357 default:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
358 gcc_unreachable ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
359 case OPTINFO_ITEM_KIND_TEXT:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
360 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
361 message->append (new json::string (item->get_text ()));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
362 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
363 break;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
364 case OPTINFO_ITEM_KIND_TREE:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
365 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
366 json::object *json_item = new json::object ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
367 json_item->set ("expr", new json::string (item->get_text ()));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
368
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
369 /* Capture any location for the node. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
370 if (LOCATION_LOCUS (item->get_location ()) != UNKNOWN_LOCATION)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
371 json_item->set ("location",
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
372 location_to_json (item->get_location ()));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
373
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
374 message->append (json_item);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
375 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
376 break;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
377 case OPTINFO_ITEM_KIND_GIMPLE:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
378 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
379 json::object *json_item = new json::object ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
380 json_item->set ("stmt", new json::string (item->get_text ()));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
381
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
382 /* Capture any location for the stmt. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
383 if (LOCATION_LOCUS (item->get_location ()) != UNKNOWN_LOCATION)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
384 json_item->set ("location",
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
385 location_to_json (item->get_location ()));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
386
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
387 message->append (json_item);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
388 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
389 break;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
390 case OPTINFO_ITEM_KIND_SYMTAB_NODE:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
391 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
392 json::object *json_item = new json::object ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
393 json_item->set ("symtab_node", new json::string (item->get_text ()));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
394
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
395 /* Capture any location for the node. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
396 if (LOCATION_LOCUS (item->get_location ()) != UNKNOWN_LOCATION)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
397 json_item->set ("location",
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
398 location_to_json (item->get_location ()));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
399 message->append (json_item);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
400 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
401 break;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
402 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
403 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
404
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
405 if (optinfo->get_pass ())
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
406 obj->set ("pass", get_id_value_for_pass (optinfo->get_pass ()));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
407
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
408 profile_count count = optinfo->get_count ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
409 if (count.initialized_p ())
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
410 obj->set ("count", profile_count_to_json (count));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
411
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
412 /* Record any location, handling the case where of an UNKNOWN_LOCATION
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
413 within an inlined block. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
414 location_t loc = optinfo->get_location_t ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
415 if (get_pure_location (line_table, loc) != UNKNOWN_LOCATION)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
416 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
417 // TOOD: record the location (just caret for now)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
418 // TODO: start/finish also?
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
419 obj->set ("location", location_to_json (loc));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
420 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
421
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
422 if (current_function_decl)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
423 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
424 const char *fnname = get_fnname_from_decl (current_function_decl);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
425 obj->set ("function", new json::string (fnname));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
426 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
427
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
428 if (loc != UNKNOWN_LOCATION)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
429 obj->set ("inlining_chain", inlining_chain_to_json (loc));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
430
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
431 return obj;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
432 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
433
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
434 /* Add a json description of PASS and its siblings to ARR, recursing into
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
435 child passes (adding their descriptions within a "children" array). */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
436
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
437 void
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
438 optrecord_json_writer::add_pass_list (json::array *arr, opt_pass *pass)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
439 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
440 do
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
441 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
442 json::object *pass_obj = pass_to_json (pass);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
443 arr->append (pass_obj);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
444 if (pass->sub)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
445 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
446 json::array *sub = new json::array ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
447 pass_obj->set ("children", sub);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
448 add_pass_list (sub, pass->sub);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
449 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
450 pass = pass->next;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
451 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
452 while (pass);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
453 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
454
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
455 /* File-level interface to rest of compiler (to avoid exposing
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
456 class optrecord_json_writer outside of this file). */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
457
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
458 static optrecord_json_writer *the_json_writer;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
459
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
460 /* Perform startup activity for -fsave-optimization-record. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
461
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
462 void
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
463 optimization_records_start ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
464 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
465 /* Bail if recording not enabled. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
466 if (!flag_save_optimization_record)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
467 return;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
468
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
469 the_json_writer = new optrecord_json_writer ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
470 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
471
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
472 /* Perform cleanup activity for -fsave-optimization-record.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
473
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
474 Currently, the file is written out here in one go, before cleaning
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
475 up. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
476
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
477 void
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
478 optimization_records_finish ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
479 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
480 /* Bail if recording not enabled. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
481 if (!the_json_writer)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
482 return;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
483
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
484 the_json_writer->write ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
485
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
486 delete the_json_writer;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
487 the_json_writer = NULL;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
488 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
489
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
490 /* Did the user request optimization records to be written out? */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
491
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
492 bool
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
493 optimization_records_enabled_p ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
494 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
495 return the_json_writer != NULL;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
496 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
497
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
498 /* If optimization records were requested, then add a record for OPTINFO
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
499 to the queue of records to be written. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
500
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
501 void
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
502 optimization_records_maybe_record_optinfo (const optinfo *optinfo)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
503 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
504 /* Bail if recording not enabled. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
505 if (!the_json_writer)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
506 return;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
507
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
508 the_json_writer->add_record (optinfo);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
509 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
510
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
511 /* Handling for the end of a dump scope for the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
512 optimization records sink. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
513
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
514 void
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
515 optimization_records_maybe_pop_dump_scope ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
516 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
517 /* Bail if recording not enabled. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
518 if (!the_json_writer)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
519 return;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
520
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
521 the_json_writer->pop_scope ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
522 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
523
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
524 #if CHECKING_P
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
525
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
526 namespace selftest {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
527
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
528 /* Verify that we can build a JSON optimization record from dump_*
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
529 calls. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
530
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
531 static void
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
532 test_building_json_from_dump_calls ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
533 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
534 temp_dump_context tmp (true, true, MSG_NOTE);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
535 dump_location_t loc;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
536 dump_printf_loc (MSG_NOTE, loc, "test of tree: ");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
537 dump_generic_expr (MSG_NOTE, TDF_SLIM, integer_zero_node);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
538 optinfo *info = tmp.get_pending_optinfo ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
539 ASSERT_TRUE (info != NULL);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
540 ASSERT_EQ (info->num_items (), 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
541
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
542 optrecord_json_writer writer;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
543 json::object *json_obj = writer.optinfo_to_json (info);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
544 ASSERT_TRUE (json_obj != NULL);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
545
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
546 /* Verify that the json is sane. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
547 pretty_printer pp;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
548 json_obj->print (&pp);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
549 const char *json_str = pp_formatted_text (&pp);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
550 ASSERT_STR_CONTAINS (json_str, "impl_location");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
551 ASSERT_STR_CONTAINS (json_str, "\"kind\": \"note\"");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
552 ASSERT_STR_CONTAINS (json_str,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
553 "\"message\": [\"test of tree: \", {\"expr\": \"0\"}]");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
554 delete json_obj;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
555 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
556
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
557 /* Run all of the selftests within this file. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
558
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
559 void
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
560 optinfo_emit_json_cc_tests ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
561 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
562 test_building_json_from_dump_calls ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
563 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
564
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
565 } // namespace selftest
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
566
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
567 #endif /* CHECKING_P */