diff options
author | David Malcolm <dmalcolm@redhat.com> | 2018-07-19 20:49:25 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2018-07-19 20:49:25 +0000 |
commit | 4df3629eb775ef9a4578c0bed3194565ca30e690 (patch) | |
tree | 6a3d9241b9f22c4142966a40b77cd934a1fc00e3 /gcc/optinfo.h | |
parent | 30c460535576882863fe4e0db740b4ac4bcfaba9 (diff) | |
download | gcc-4df3629eb775ef9a4578c0bed3194565ca30e690.zip gcc-4df3629eb775ef9a4578c0bed3194565ca30e690.tar.gz gcc-4df3629eb775ef9a4578c0bed3194565ca30e690.tar.bz2 |
Add "optinfo" framework
This patch implements a way to consolidate dump_* calls into
optinfo objects, as enabling work towards being able to write out
optimization records to a file.
The patch adds the support for building optinfo instances from dump_*
calls, but leaves implementing any *users* of them to followup patches.
gcc/ChangeLog:
* Makefile.in (OBJS): Add optinfo.o.
* coretypes.h (class symtab_node): New forward decl.
(struct cgraph_node): New forward decl.
(class varpool_node): New forward decl.
* dump-context.h: New file.
* dumpfile.c: Include "optinfo.h", "dump-context.h", "cgraph.h",
"tree-pass.h".
(refresh_dumps_are_enabled): Use optinfo_enabled_p.
(set_dump_file): Call dumpfile_ensure_any_optinfo_are_flushed.
(set_alt_dump_file): Likewise.
(dump_context::~dump_context): New dtor.
(dump_gimple_stmt): Move implementation to...
(dump_context::dump_gimple_stmt): ...this new member function.
Add the stmt to any pending optinfo, creating one if need be.
(dump_gimple_stmt_loc): Move implementation to...
(dump_context::dump_gimple_stmt_loc): ...this new member function.
Start a new optinfo and add the stmt to it.
(dump_gimple_expr): Move implementation to...
(dump_context::dump_gimple_expr): ...this new member function.
Add the stmt to any pending optinfo, creating one if need be.
(dump_gimple_expr_loc): Move implementation to...
(dump_context::dump_gimple_expr_loc): ...this new member function.
Start a new optinfo and add the stmt to it.
(dump_generic_expr): Move implementation to...
(dump_context::dump_generic_expr): ...this new member function.
Add the tree to any pending optinfo, creating one if need be.
(dump_generic_expr_loc): Move implementation to...
(dump_context::dump_generic_expr_loc): ...this new member
function. Add the tree to any pending optinfo, creating one if
need be.
(dump_printf): Move implementation to...
(dump_context::dump_printf_va): ...this new member function. Add
the text to any pending optinfo, creating one if need be.
(dump_printf_loc): Move implementation to...
(dump_context::dump_printf_loc_va): ...this new member function.
Start a new optinfo and add the stmt to it.
(dump_dec): Move implementation to...
(dump_context::dump_dec): ...this new member function. Add the
value to any pending optinfo, creating one if need be.
(dump_context::dump_symtab_node): New member function.
(dump_context::get_scope_depth): New member function.
(dump_context::begin_scope): New member function.
(dump_context::end_scope): New member function.
(dump_context::ensure_pending_optinfo): New member function.
(dump_context::begin_next_optinfo): New member function.
(dump_context::end_any_optinfo): New member function.
(dump_context::s_current): New global.
(dump_context::s_default): New global.
(dump_scope_depth): Delete global.
(dumpfile_ensure_any_optinfo_are_flushed): New function.
(dump_symtab_node): New function.
(get_dump_scope_depth): Reimplement in terms of dump_context.
(dump_begin_scope): Likewise.
(dump_end_scope): Likewise.
(selftest::temp_dump_context::temp_dump_context): New ctor.
(selftest::temp_dump_context::~temp_dump_context): New dtor.
(selftest::verify_item): New function.
(ASSERT_IS_TEXT): New macro.
(ASSERT_IS_TREE): New macro.
(ASSERT_IS_GIMPLE): New macro.
(selftest::test_capture_of_dump_calls): New test.
(selftest::dumpfile_c_tests): Call it.
* dumpfile.h (dump_printf, dump_printf_loc, dump_basic_block)
(dump_generic_expr_loc, dump_generic_expr, dump_gimple_stmt_loc)
(dump_gimple_stmt, dump_dec): Gather these related decls and add a
descriptive comment.
(dump_function, print_combine_total_stats, enable_rtl_dump_file)
(dump_node, dump_bb): Move these unrelated decls.
(class dump_manager): Add leading comment.
* optinfo.cc: New file.
* optinfo.h: New file.
From-SVN: r262891
Diffstat (limited to 'gcc/optinfo.h')
-rw-r--r-- | gcc/optinfo.h | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/gcc/optinfo.h b/gcc/optinfo.h new file mode 100644 index 0000000..8fd5202 --- /dev/null +++ b/gcc/optinfo.h @@ -0,0 +1,203 @@ +/* Optimization information. + Copyright (C) 2018 Free Software Foundation, Inc. + Contributed by David Malcolm <dmalcolm@redhat.com>. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 3, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +<http://www.gnu.org/licenses/>. */ + +#ifndef GCC_OPTINFO_H +#define GCC_OPTINFO_H + +/* An "optinfo" is a bundle of information describing part of an + optimization, which can be emitted to zero or more of several + destinations, such as: + + * as a "remark" through the diagnostics subsystem + + * saved to a file as an "optimization record" + + Currently no such destinations are implemented. + + They are generated in response to calls to the "dump_*" API in + dumpfile.h; repeated calls to the "dump_*" API are consolidated + into a pending optinfo instance, with a "dump_*_loc" starting a new + optinfo instance. + + The data sent to the dump calls are captured within the pending optinfo + instance as a sequence of optinfo_items. For example, given: + + if (dump_enabled_p ()) + { + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, + "not vectorized: live stmt not supported: "); + dump_gimple_stmt (MSG_MISSED_OPTIMIZATION, TDF_SLIM, stmt, 0); + } + + the "dump_printf_loc" call begins a new optinfo containing two items: + (1) a text item containing "not vectorized: live stmt not supported: " + (2) a gimple item for "stmt" + + Dump destinations are thus able to access rich metadata about the + items when the optinfo is emitted to them, rather than just having plain + text. For example, when saving the above optinfo to a file as an + "optimization record", the record could capture the source location of + "stmt" above, rather than just its textual form. + + The currently pending optinfo is emitted and deleted: + * each time a "dump_*_loc" call occurs (which starts the next optinfo), or + * when the dump files are changed (at the end of a pass) + + Dumping to an optinfo instance is non-trivial (due to building optinfo_item + instances), so all usage should be guarded by + + if (optinfo_enabled_p ()) + + which is off by default. */ + + +/* Forward decls. */ +struct opt_pass; +class optinfo_item; + +/* Should optinfo instances be created? + All creation of optinfos should be guarded by this predicate. + Return true if any optinfo destinations are active. */ + +extern bool optinfo_enabled_p (); + +/* Return true if any of the active optinfo destinations make use + of inlining information. + (if true, then the information is preserved). */ + +extern bool optinfo_wants_inlining_info_p (); + +/* The various kinds of optinfo. */ + +enum optinfo_kind +{ + OPTINFO_KIND_SUCCESS, + OPTINFO_KIND_FAILURE, + OPTINFO_KIND_NOTE, + OPTINFO_KIND_SCOPE +}; + +extern const char *optinfo_kind_to_string (enum optinfo_kind kind); + +/* A bundle of information describing part of an optimization. */ + +class optinfo +{ + friend class dump_context; + + public: + optinfo (const dump_location_t &loc, + enum optinfo_kind kind, + opt_pass *pass) + : m_loc (loc), m_kind (kind), m_pass (pass), m_items () + {} + ~optinfo (); + + const dump_user_location_t & + get_user_location () const { return m_loc.get_user_location (); } + + const dump_impl_location_t & + get_impl_location () const { return m_loc.get_impl_location (); } + + enum optinfo_kind get_kind () const { return m_kind; } + opt_pass *get_pass () const { return m_pass; } + unsigned int num_items () const { return m_items.length (); } + const optinfo_item *get_item (unsigned int i) const { return m_items[i]; } + + location_t get_location_t () const { return m_loc.get_location_t (); } + profile_count get_count () const { return m_loc.get_count (); } + + private: + void emit (); + + /* Pre-canned ways of manipulating the optinfo, for use by friend class + dump_context. */ + void handle_dump_file_kind (dump_flags_t); + void add_string (const char *str); + void add_printf (const char *format, ...) ATTRIBUTE_PRINTF_2; + void add_printf_va (const char *format, va_list ap) ATTRIBUTE_PRINTF (2, 0); + void add_gimple_stmt (gimple *stmt, int spc, dump_flags_t dump_flags); + void add_gimple_expr (gimple *stmt, int spc, dump_flags_t dump_flags); + void add_tree (tree node, dump_flags_t dump_flags); + void add_symtab_node (symtab_node *node); + void add_dec (const wide_int_ref &wi, signop sgn); + + template<unsigned int N, typename C> + void add_poly_int (const poly_int<N, C> &value) + { + /* Compare with dump_dec (MSG_NOTE, ). */ + + STATIC_ASSERT (poly_coeff_traits<C>::signedness >= 0); + signop sgn = poly_coeff_traits<C>::signedness ? SIGNED : UNSIGNED; + + if (value.is_constant ()) + add_dec (value.coeffs[0], sgn); + else + { + add_string ("["); + for (unsigned int i = 0; i < N; ++i) + { + add_dec (value.coeffs[i], sgn); + add_string (i == N - 1 ? "]" : ","); + } + } + } + + private: + dump_location_t m_loc; + enum optinfo_kind m_kind; + opt_pass *m_pass; + auto_vec <optinfo_item *> m_items; +}; + +/* An enum for discriminating between different kinds of optinfo_item. */ + +enum optinfo_item_kind +{ + OPTINFO_ITEM_KIND_TEXT, + OPTINFO_ITEM_KIND_TREE, + OPTINFO_ITEM_KIND_GIMPLE, + OPTINFO_ITEM_KIND_SYMTAB_NODE +}; + +/* An item within an optinfo. */ + +class optinfo_item +{ + public: + optinfo_item (enum optinfo_item_kind kind, location_t location, + char *text, bool owned); + ~optinfo_item (); + + enum optinfo_item_kind get_kind () const { return m_kind; } + location_t get_location () const { return m_location; } + const char *get_text () const { return m_text; } + + private: + /* Metadata (e.g. for optimization records). */ + enum optinfo_item_kind m_kind; + location_t m_location; + + /* The textual form of the item. */ + char *m_text; + bool m_owned; +}; + +#endif /* #ifndef GCC_OPTINFO_H */ |