131
|
1 /* Optimization information.
|
145
|
2 Copyright (C) 2018-2020 Free Software Foundation, Inc.
|
131
|
3 Contributed by David Malcolm <dmalcolm@redhat.com>.
|
|
4
|
|
5 This file is part of GCC.
|
|
6
|
|
7 GCC is free software; you can redistribute it and/or modify it under
|
|
8 the terms of the GNU General Public License as published by the Free
|
|
9 Software Foundation; either version 3, or (at your option) any later
|
|
10 version.
|
|
11
|
|
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
15 for more details.
|
|
16
|
|
17 You should have received a copy of the GNU General Public License
|
|
18 along with GCC; see the file COPYING3. If not see
|
|
19 <http://www.gnu.org/licenses/>. */
|
|
20
|
|
21 #include "config.h"
|
|
22 #include "system.h"
|
|
23 #include "coretypes.h"
|
|
24
|
|
25 #include "backend.h"
|
|
26 #include "tree.h"
|
|
27 #include "gimple.h"
|
|
28
|
|
29 #include "optinfo.h"
|
|
30 #include "optinfo-emit-json.h"
|
|
31 #include "dump-context.h"
|
|
32 #include "pretty-print.h"
|
|
33 #include "gimple-pretty-print.h"
|
|
34 #include "cgraph.h"
|
|
35 #include "selftest.h"
|
|
36
|
|
37 /* optinfo_item's ctor. Takes ownership of TEXT. */
|
|
38
|
|
39 optinfo_item::optinfo_item (enum optinfo_item_kind kind, location_t location,
|
|
40 char *text)
|
|
41 : m_kind (kind), m_location (location), m_text (text)
|
|
42 {
|
|
43 }
|
|
44
|
|
45 /* optinfo_item's dtor. */
|
|
46
|
|
47 optinfo_item::~optinfo_item ()
|
|
48 {
|
|
49 free (m_text);
|
|
50 }
|
|
51
|
|
52 /* Get a string from KIND. */
|
|
53
|
|
54 const char *
|
|
55 optinfo_kind_to_string (enum optinfo_kind kind)
|
|
56 {
|
|
57 switch (kind)
|
|
58 {
|
|
59 default:
|
|
60 gcc_unreachable ();
|
|
61 case OPTINFO_KIND_SUCCESS:
|
|
62 return "success";
|
|
63 case OPTINFO_KIND_FAILURE:
|
|
64 return "failure";
|
|
65 case OPTINFO_KIND_NOTE:
|
|
66 return "note";
|
|
67 case OPTINFO_KIND_SCOPE:
|
|
68 return "scope";
|
|
69 }
|
|
70 }
|
|
71
|
|
72 /* optinfo's dtor. */
|
|
73
|
|
74 optinfo::~optinfo ()
|
|
75 {
|
|
76 /* Cleanup. */
|
|
77 unsigned i;
|
|
78 optinfo_item *item;
|
|
79 FOR_EACH_VEC_ELT (m_items, i, item)
|
|
80 delete item;
|
|
81 }
|
|
82
|
|
83 /* Add ITEM to this optinfo. */
|
|
84
|
|
85 void
|
|
86 optinfo::add_item (optinfo_item *item)
|
|
87 {
|
|
88 gcc_assert (item);
|
|
89 m_items.safe_push (item);
|
|
90 }
|
|
91
|
|
92 /* Get MSG_* flags corresponding to KIND. */
|
|
93
|
|
94 static dump_flags_t
|
|
95 optinfo_kind_to_dump_flag (enum optinfo_kind kind)
|
|
96 {
|
|
97 switch (kind)
|
|
98 {
|
|
99 default:
|
|
100 gcc_unreachable ();
|
|
101 case OPTINFO_KIND_SUCCESS:
|
|
102 return MSG_OPTIMIZED_LOCATIONS;
|
|
103 case OPTINFO_KIND_FAILURE:
|
|
104 return MSG_MISSED_OPTIMIZATION;
|
|
105 case OPTINFO_KIND_NOTE:
|
|
106 case OPTINFO_KIND_SCOPE:
|
|
107 return MSG_NOTE;
|
|
108 }
|
|
109 }
|
|
110
|
|
111 /* Re-emit this optinfo, both to the "non-immediate" destinations,
|
|
112 *and* to the "immediate" destinations. */
|
|
113
|
|
114 void
|
|
115 optinfo::emit_for_opt_problem () const
|
|
116 {
|
|
117 dump_flags_t dump_kind = optinfo_kind_to_dump_flag (get_kind ());
|
|
118 dump_kind |= MSG_PRIORITY_REEMITTED;
|
|
119
|
|
120 /* Re-emit to "immediate" destinations, without creating a new optinfo. */
|
145
|
121 dump_context::get ().dump_loc_immediate (dump_kind, get_user_location ());
|
131
|
122 unsigned i;
|
|
123 optinfo_item *item;
|
|
124 FOR_EACH_VEC_ELT (m_items, i, item)
|
|
125 dump_context::get ().emit_item (item, dump_kind);
|
|
126
|
|
127 /* Re-emit to "non-immediate" destinations. */
|
145
|
128 dump_context::get ().emit_optinfo (this);
|
131
|
129 }
|
|
130
|
|
131 /* Update the optinfo's kind based on DUMP_KIND. */
|
|
132
|
|
133 void
|
|
134 optinfo::handle_dump_file_kind (dump_flags_t dump_kind)
|
|
135 {
|
145
|
136 /* Any optinfo for a "scope" should have been emitted separately. */
|
|
137 gcc_assert (m_kind != OPTINFO_KIND_SCOPE);
|
|
138
|
131
|
139 if (dump_kind & MSG_OPTIMIZED_LOCATIONS)
|
|
140 m_kind = OPTINFO_KIND_SUCCESS;
|
|
141 else if (dump_kind & MSG_MISSED_OPTIMIZATION)
|
|
142 m_kind = OPTINFO_KIND_FAILURE;
|
|
143 else if (dump_kind & MSG_NOTE)
|
|
144 m_kind = OPTINFO_KIND_NOTE;
|
|
145 }
|
|
146
|
|
147 /* Return true if any of the active optinfo destinations make use
|
|
148 of inlining information.
|
|
149 (if true, then the information is preserved). */
|
|
150
|
|
151 bool optinfo_wants_inlining_info_p ()
|
|
152 {
|
145
|
153 return dump_context::get ().optimization_records_enabled_p ();
|
131
|
154 }
|