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 #ifndef GCC_OPTINFO_H 22 #define GCC_OPTINFO_H 23 24 /* An "optinfo" is a bundle of information describing part of an 25 optimization, which can be emitted to zero or more of several 26 destinations, such as: 27 28 * saved to a file as an "optimization record" 29 30 They are generated in response to calls to the "dump_*" API in 31 dumpfile.h; repeated calls to the "dump_*" API are consolidated 32 into a pending optinfo instance, with a "dump_*_loc" starting a new 33 optinfo instance. 34 35 The data sent to the dump calls are captured within the pending optinfo 36 instance as a sequence of optinfo_items. For example, given: 37 38 if (dump_enabled_p ()) 39 { 40 dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, 41 "not vectorized: live stmt not supported: "); 42 dump_gimple_stmt (MSG_MISSED_OPTIMIZATION, TDF_SLIM, stmt, 0); 43 } 44 45 the "dump_printf_loc" call begins a new optinfo containing two items: 46 (1) a text item containing "not vectorized: live stmt not supported: " 47 (2) a gimple item for "stmt" 48 49 Dump destinations are thus able to access rich metadata about the 50 items when the optinfo is emitted to them, rather than just having plain 51 text. For example, when saving the above optinfo to a file as an 52 "optimization record", the record could capture the source location of 53 "stmt" above, rather than just its textual form. 54 55 The currently pending optinfo is emitted and deleted: 56 * each time a "dump_*_loc" call occurs (which starts the next optinfo), or 57 * when the dump files are changed (at the end of a pass) 58 59 Dumping to an optinfo instance is non-trivial (due to building optinfo_item 60 instances), so all usage should be guarded by 61 62 if (optinfo_enabled_p ()) 63 64 which is off by default. */ 65 66 67 /* Forward decls. */ 68 class opt_pass; 69 class optinfo_item; 70 71 /* Return true if any of the active optinfo destinations make use 72 of inlining information. 73 (if true, then the information is preserved). */ 74 75 extern bool optinfo_wants_inlining_info_p (); 76 77 /* The various kinds of optinfo. */ 78 79 enum optinfo_kind 80 { 81 OPTINFO_KIND_SUCCESS, 82 OPTINFO_KIND_FAILURE, 83 OPTINFO_KIND_NOTE, 84 OPTINFO_KIND_SCOPE 85 }; 86 87 extern const char *optinfo_kind_to_string (enum optinfo_kind kind); 88 89 class dump_context; 90 91 /* A bundle of information describing part of an optimization. */ 92 93 class optinfo 94 { 95 friend class dump_context; 96 97 public: optinfo(const dump_location_t & loc,enum optinfo_kind kind,opt_pass * pass)98 optinfo (const dump_location_t &loc, 99 enum optinfo_kind kind, 100 opt_pass *pass) 101 : m_loc (loc), m_kind (kind), m_pass (pass), m_items () 102 {} 103 ~optinfo (); 104 105 const dump_location_t & get_dump_location()106 get_dump_location () const { return m_loc; } 107 108 const dump_user_location_t & get_user_location()109 get_user_location () const { return m_loc.get_user_location (); } 110 111 const dump_impl_location_t & get_impl_location()112 get_impl_location () const { return m_loc.get_impl_location (); } 113 get_kind()114 enum optinfo_kind get_kind () const { return m_kind; } get_pass()115 opt_pass *get_pass () const { return m_pass; } num_items()116 unsigned int num_items () const { return m_items.length (); } get_item(unsigned int i)117 const optinfo_item *get_item (unsigned int i) const { return m_items[i]; } 118 get_location_t()119 location_t get_location_t () const { return m_loc.get_location_t (); } get_count()120 profile_count get_count () const { return m_loc.get_count (); } 121 122 void add_item (optinfo_item *item); 123 124 void emit_for_opt_problem () const; 125 126 private: 127 /* Pre-canned ways of manipulating the optinfo, for use by friend class 128 dump_context. */ 129 void handle_dump_file_kind (dump_flags_t); 130 131 private: 132 dump_location_t m_loc; 133 enum optinfo_kind m_kind; 134 opt_pass *m_pass; 135 auto_vec <optinfo_item *> m_items; 136 }; 137 138 /* An enum for discriminating between different kinds of optinfo_item. */ 139 140 enum optinfo_item_kind 141 { 142 OPTINFO_ITEM_KIND_TEXT, 143 OPTINFO_ITEM_KIND_TREE, 144 OPTINFO_ITEM_KIND_GIMPLE, 145 OPTINFO_ITEM_KIND_SYMTAB_NODE 146 }; 147 148 /* An item within an optinfo. */ 149 150 class optinfo_item 151 { 152 public: 153 optinfo_item (enum optinfo_item_kind kind, location_t location, 154 char *text); 155 ~optinfo_item (); 156 get_kind()157 enum optinfo_item_kind get_kind () const { return m_kind; } get_location()158 location_t get_location () const { return m_location; } get_text()159 const char *get_text () const { return m_text; } 160 161 private: 162 /* Metadata (e.g. for optimization records). */ 163 enum optinfo_item_kind m_kind; 164 location_t m_location; 165 166 /* The textual form of the item, owned by the item. */ 167 char *m_text; 168 }; 169 170 #endif /* #ifndef GCC_OPTINFO_H */ 171