xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/optinfo.cc (revision 4c3eb207d36f67d31994830c0a694161fc1ca39b)
1 /* Optimization information.
2    Copyright (C) 2018-2020 Free Software Foundation, Inc.
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 
optinfo_item(enum optinfo_item_kind kind,location_t location,char * text)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 
~optinfo_item()47 optinfo_item::~optinfo_item ()
48 {
49   free (m_text);
50 }
51 
52 /* Get a string from KIND.  */
53 
54 const char *
optinfo_kind_to_string(enum optinfo_kind kind)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 
~optinfo()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
add_item(optinfo_item * item)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
optinfo_kind_to_dump_flag(enum optinfo_kind kind)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
emit_for_opt_problem() const115 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.  */
121   dump_context::get ().dump_loc_immediate (dump_kind, get_user_location ());
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.  */
128   dump_context::get ().emit_optinfo (this);
129 }
130 
131 /* Update the optinfo's kind based on DUMP_KIND.  */
132 
133 void
handle_dump_file_kind(dump_flags_t dump_kind)134 optinfo::handle_dump_file_kind (dump_flags_t dump_kind)
135 {
136   /* Any optinfo for a "scope" should have been emitted separately.  */
137   gcc_assert (m_kind != OPTINFO_KIND_SCOPE);
138 
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 
optinfo_wants_inlining_info_p()151 bool optinfo_wants_inlining_info_p ()
152 {
153   return dump_context::get ().optimization_records_enabled_p ();
154 }
155