diff mbox series

[2/4] Remove unused functions and fields.

Message ID 192f112275eb2c7bc74fdd3b91c0b32882695d22.1537774329.git.mliska@suse.cz
State New
Headers show
Series Clean-up warnings spotted by Rtags | expand

Commit Message

Martin Liška Sept. 22, 2018, 7:08 p.m. UTC
gcc/ChangeLog:

2018-09-24  Martin Liska  <mliska@suse.cz>

	* alias.c (set_dest_equal_p): Remove unused function.
	* config/i386/i386.c (def_builtin_pure2): Likewise.
	* diagnostic-show-locus.c (class layout): Remove
	unused field.
	(layout::layout): Likewise here.
	* dump-context.h (class temp_dump_context): Likewise.
	* dwarf2out.c (add_AT_fde_ref): Remove unused function.
	(add_AT_loclistsptr): Likewise.
	(add_AT_offset): Likewise.
	(get_AT_hi_pc): Likewise.
	(is_comdat_die): Likewise.
	(type_is_enum): Likewise.
	(ceiling): Likewise.
	(add_AT_vms_delta): Likewise.
	(is_class_die): Likewise.
	* edit-context.c (class line_event): Remove unused field.
	* graphite-sese-to-poly.c (tree_int_to_gmp): Remove
	unused function.
	* ipa-cp.c (ipa_get_vr_lat): Likewise.
	* lra-constraints.c (ok_for_index_p_nonstrict): Likewise.
	(ok_for_base_p_nonstrict): Likewise.
	* tree-chrec.c (is_not_constant_evolution): Likewise.
	(chrec_fold_poly_cst): Likewise.
	* tree-if-conv.c (has_pred_critical_p): Likewise.
	* tree-ssa-coalesce.c (print_exprs): Likewise.
	* tree-ssa-pre.c (bitmap_set_contains_expr): Likewise.
	* tree-ssa-uninit.c (is_and_or_or_p): Likewise.
	* tree-vrp.c (value_ranges_intersect_p): Likewise.
	(value_range_nonnegative_p): Likewise.

gcc/cp/ChangeLog:

2018-09-24  Martin Liska  <mliska@suse.cz>

	* name-lookup.c (namespace_scope_ht_size): Remove
	unused function.
	* parser.c (cp_lexer_next_token_is_not_keyword): Likewise.

gcc/fortran/ChangeLog:

2018-09-24  Martin Liska  <mliska@suse.cz>

	* trans.c (remove_suffix): Remove
	unused function.

gcc/go/ChangeLog:

2018-09-24  Martin Liska  <mliska@suse.cz>

	* gofrontend/escape.cc (Gogo::analyze_escape): Remove
	usage of a parameter.
	(Gogo::assign_connectivity): Likewise.
	(class Escape_analysis_tag): Likewise.
	(Gogo::tag_function): Likewise.
	* gofrontend/expressions.cc (Call_expression::do_type): Likewise.
	* gofrontend/gogo.h (class Gogo): Likewise.
	* gofrontend/types.cc (class Call_multiple_result_type): Likewise.
	(Type::make_call_multiple_result_type): Likewise.
	* gofrontend/types.h (class Type): Likewise.
	* gofrontend/wb.cc (class Check_escape): Likewise.
	(Gogo::add_write_barriers): Likewise.
---
 gcc/alias.c                      |   9 --
 gcc/config/i386/i386.c           |  15 ----
 gcc/cp/name-lookup.c             |  15 ----
 gcc/cp/parser.c                  |   8 --
 gcc/diagnostic-show-locus.c      |   2 -
 gcc/dump-context.h               |   1 -
 gcc/dwarf2out.c                  | 141 -------------------------------
 gcc/edit-context.c               |   3 +-
 gcc/fortran/trans.c              |  20 -----
 gcc/go/gofrontend/escape.cc      |  20 ++---
 gcc/go/gofrontend/expressions.cc |   2 +-
 gcc/go/gofrontend/gogo.h         |   2 +-
 gcc/go/gofrontend/types.cc       |  13 +--
 gcc/go/gofrontend/types.h        |   2 +-
 gcc/go/gofrontend/wb.cc          |  10 +--
 gcc/graphite-sese-to-poly.c      |   8 --
 gcc/ipa-cp.c                     |  10 ---
 gcc/lra-constraints.c            |  27 ------
 gcc/tree-chrec.c                 |  47 -----------
 gcc/tree-if-conv.c               |  13 ---
 gcc/tree-ssa-coalesce.c          |  16 ----
 gcc/tree-ssa-pre.c               |   6 --
 gcc/tree-ssa-uninit.c            |  10 ---
 gcc/tree-vrp.c                   |  38 ---------
 24 files changed, 18 insertions(+), 420 deletions(-)

Comments

Jeff Law Sept. 24, 2018, 2:42 p.m. UTC | #1
On 9/22/18 1:08 PM, marxin wrote:
> 
> gcc/ChangeLog:
> 
> 2018-09-24  Martin Liska  <mliska@suse.cz>
> 
> 	* alias.c (set_dest_equal_p): Remove unused function.
> 	* config/i386/i386.c (def_builtin_pure2): Likewise.
> 	* diagnostic-show-locus.c (class layout): Remove
> 	unused field.
> 	(layout::layout): Likewise here.
> 	* dump-context.h (class temp_dump_context): Likewise.
> 	* dwarf2out.c (add_AT_fde_ref): Remove unused function.
> 	(add_AT_loclistsptr): Likewise.
> 	(add_AT_offset): Likewise.
> 	(get_AT_hi_pc): Likewise.
> 	(is_comdat_die): Likewise.
> 	(type_is_enum): Likewise.
> 	(ceiling): Likewise.
> 	(add_AT_vms_delta): Likewise.
> 	(is_class_die): Likewise.
> 	* edit-context.c (class line_event): Remove unused field.
> 	* graphite-sese-to-poly.c (tree_int_to_gmp): Remove
> 	unused function.
> 	* ipa-cp.c (ipa_get_vr_lat): Likewise.
> 	* lra-constraints.c (ok_for_index_p_nonstrict): Likewise.
> 	(ok_for_base_p_nonstrict): Likewise.
> 	* tree-chrec.c (is_not_constant_evolution): Likewise.
> 	(chrec_fold_poly_cst): Likewise.
> 	* tree-if-conv.c (has_pred_critical_p): Likewise.
> 	* tree-ssa-coalesce.c (print_exprs): Likewise.
> 	* tree-ssa-pre.c (bitmap_set_contains_expr): Likewise.
> 	* tree-ssa-uninit.c (is_and_or_or_p): Likewise.
> 	* tree-vrp.c (value_ranges_intersect_p): Likewise.
> 	(value_range_nonnegative_p): Likewise.
> 
> gcc/cp/ChangeLog:
> 
> 2018-09-24  Martin Liska  <mliska@suse.cz>
> 
> 	* name-lookup.c (namespace_scope_ht_size): Remove
> 	unused function.
> 	* parser.c (cp_lexer_next_token_is_not_keyword): Likewise.
> 
> gcc/fortran/ChangeLog:
> 
> 2018-09-24  Martin Liska  <mliska@suse.cz>
> 
> 	* trans.c (remove_suffix): Remove
> 	unused function.
> 
> gcc/go/ChangeLog:
> 
> 2018-09-24  Martin Liska  <mliska@suse.cz>
> 
> 	* gofrontend/escape.cc (Gogo::analyze_escape): Remove
> 	usage of a parameter.
> 	(Gogo::assign_connectivity): Likewise.
> 	(class Escape_analysis_tag): Likewise.
> 	(Gogo::tag_function): Likewise.
> 	* gofrontend/expressions.cc (Call_expression::do_type): Likewise.
> 	* gofrontend/gogo.h (class Gogo): Likewise.
> 	* gofrontend/types.cc (class Call_multiple_result_type): Likewise.
> 	(Type::make_call_multiple_result_type): Likewise.
> 	* gofrontend/types.h (class Type): Likewise.
> 	* gofrontend/wb.cc (class Check_escape): Likewise.
> 	(Gogo::add_write_barriers): Likewise.
Note that some of these may be used inside conditional code.  For
example the add_AT_vms_delta is used by ia64-vms.  You could argue that
ia64-vms is a zombie and should be removed, but the general concern WRT
conditionally compiled code holds.

Jeff
Martin Liška Sept. 25, 2018, 7:09 a.m. UTC | #2
On 9/24/18 4:42 PM, Jeff Law wrote:
> On 9/22/18 1:08 PM, marxin wrote:
>>
>> gcc/ChangeLog:
>>
>> 2018-09-24  Martin Liska  <mliska@suse.cz>
>>
>> 	* alias.c (set_dest_equal_p): Remove unused function.
>> 	* config/i386/i386.c (def_builtin_pure2): Likewise.
>> 	* diagnostic-show-locus.c (class layout): Remove
>> 	unused field.
>> 	(layout::layout): Likewise here.
>> 	* dump-context.h (class temp_dump_context): Likewise.
>> 	* dwarf2out.c (add_AT_fde_ref): Remove unused function.
>> 	(add_AT_loclistsptr): Likewise.
>> 	(add_AT_offset): Likewise.
>> 	(get_AT_hi_pc): Likewise.
>> 	(is_comdat_die): Likewise.
>> 	(type_is_enum): Likewise.
>> 	(ceiling): Likewise.
>> 	(add_AT_vms_delta): Likewise.
>> 	(is_class_die): Likewise.
>> 	* edit-context.c (class line_event): Remove unused field.
>> 	* graphite-sese-to-poly.c (tree_int_to_gmp): Remove
>> 	unused function.
>> 	* ipa-cp.c (ipa_get_vr_lat): Likewise.
>> 	* lra-constraints.c (ok_for_index_p_nonstrict): Likewise.
>> 	(ok_for_base_p_nonstrict): Likewise.
>> 	* tree-chrec.c (is_not_constant_evolution): Likewise.
>> 	(chrec_fold_poly_cst): Likewise.
>> 	* tree-if-conv.c (has_pred_critical_p): Likewise.
>> 	* tree-ssa-coalesce.c (print_exprs): Likewise.
>> 	* tree-ssa-pre.c (bitmap_set_contains_expr): Likewise.
>> 	* tree-ssa-uninit.c (is_and_or_or_p): Likewise.
>> 	* tree-vrp.c (value_ranges_intersect_p): Likewise.
>> 	(value_range_nonnegative_p): Likewise.
>>
>> gcc/cp/ChangeLog:
>>
>> 2018-09-24  Martin Liska  <mliska@suse.cz>
>>
>> 	* name-lookup.c (namespace_scope_ht_size): Remove
>> 	unused function.
>> 	* parser.c (cp_lexer_next_token_is_not_keyword): Likewise.
>>
>> gcc/fortran/ChangeLog:
>>
>> 2018-09-24  Martin Liska  <mliska@suse.cz>
>>
>> 	* trans.c (remove_suffix): Remove
>> 	unused function.
>>
>> gcc/go/ChangeLog:
>>
>> 2018-09-24  Martin Liska  <mliska@suse.cz>
>>
>> 	* gofrontend/escape.cc (Gogo::analyze_escape): Remove
>> 	usage of a parameter.
>> 	(Gogo::assign_connectivity): Likewise.
>> 	(class Escape_analysis_tag): Likewise.
>> 	(Gogo::tag_function): Likewise.
>> 	* gofrontend/expressions.cc (Call_expression::do_type): Likewise.
>> 	* gofrontend/gogo.h (class Gogo): Likewise.
>> 	* gofrontend/types.cc (class Call_multiple_result_type): Likewise.
>> 	(Type::make_call_multiple_result_type): Likewise.
>> 	* gofrontend/types.h (class Type): Likewise.
>> 	* gofrontend/wb.cc (class Check_escape): Likewise.
>> 	(Gogo::add_write_barriers): Likewise.
> Note that some of these may be used inside conditional code.  For
> example the add_AT_vms_delta is used by ia64-vms.  You could argue that
> ia64-vms is a zombie and should be removed, but the general concern WRT
> conditionally compiled code holds.

Well, please let me install the patch as is and if somebody will need the
functionality, I would be happy to put it back.

Thanks,
Martin

> 
> Jeff
>
Richard Biener Sept. 25, 2018, 12:19 p.m. UTC | #3
On Tue, Sep 25, 2018 at 9:09 AM Martin Liška <mliska@suse.cz> wrote:
>
> On 9/24/18 4:42 PM, Jeff Law wrote:
> > On 9/22/18 1:08 PM, marxin wrote:
> >>
> >> gcc/ChangeLog:
> >>
> >> 2018-09-24  Martin Liska  <mliska@suse.cz>
> >>
> >>      * alias.c (set_dest_equal_p): Remove unused function.
> >>      * config/i386/i386.c (def_builtin_pure2): Likewise.
> >>      * diagnostic-show-locus.c (class layout): Remove
> >>      unused field.
> >>      (layout::layout): Likewise here.
> >>      * dump-context.h (class temp_dump_context): Likewise.
> >>      * dwarf2out.c (add_AT_fde_ref): Remove unused function.
> >>      (add_AT_loclistsptr): Likewise.
> >>      (add_AT_offset): Likewise.
> >>      (get_AT_hi_pc): Likewise.
> >>      (is_comdat_die): Likewise.
> >>      (type_is_enum): Likewise.
> >>      (ceiling): Likewise.
> >>      (add_AT_vms_delta): Likewise.
> >>      (is_class_die): Likewise.
> >>      * edit-context.c (class line_event): Remove unused field.
> >>      * graphite-sese-to-poly.c (tree_int_to_gmp): Remove
> >>      unused function.
> >>      * ipa-cp.c (ipa_get_vr_lat): Likewise.
> >>      * lra-constraints.c (ok_for_index_p_nonstrict): Likewise.
> >>      (ok_for_base_p_nonstrict): Likewise.
> >>      * tree-chrec.c (is_not_constant_evolution): Likewise.
> >>      (chrec_fold_poly_cst): Likewise.
> >>      * tree-if-conv.c (has_pred_critical_p): Likewise.
> >>      * tree-ssa-coalesce.c (print_exprs): Likewise.
> >>      * tree-ssa-pre.c (bitmap_set_contains_expr): Likewise.
> >>      * tree-ssa-uninit.c (is_and_or_or_p): Likewise.
> >>      * tree-vrp.c (value_ranges_intersect_p): Likewise.
> >>      (value_range_nonnegative_p): Likewise.
> >>
> >> gcc/cp/ChangeLog:
> >>
> >> 2018-09-24  Martin Liska  <mliska@suse.cz>
> >>
> >>      * name-lookup.c (namespace_scope_ht_size): Remove
> >>      unused function.
> >>      * parser.c (cp_lexer_next_token_is_not_keyword): Likewise.
> >>
> >> gcc/fortran/ChangeLog:
> >>
> >> 2018-09-24  Martin Liska  <mliska@suse.cz>
> >>
> >>      * trans.c (remove_suffix): Remove
> >>      unused function.
> >>
> >> gcc/go/ChangeLog:
> >>
> >> 2018-09-24  Martin Liska  <mliska@suse.cz>
> >>
> >>      * gofrontend/escape.cc (Gogo::analyze_escape): Remove
> >>      usage of a parameter.
> >>      (Gogo::assign_connectivity): Likewise.
> >>      (class Escape_analysis_tag): Likewise.
> >>      (Gogo::tag_function): Likewise.
> >>      * gofrontend/expressions.cc (Call_expression::do_type): Likewise.
> >>      * gofrontend/gogo.h (class Gogo): Likewise.
> >>      * gofrontend/types.cc (class Call_multiple_result_type): Likewise.
> >>      (Type::make_call_multiple_result_type): Likewise.
> >>      * gofrontend/types.h (class Type): Likewise.
> >>      * gofrontend/wb.cc (class Check_escape): Likewise.
> >>      (Gogo::add_write_barriers): Likewise.
> > Note that some of these may be used inside conditional code.  For
> > example the add_AT_vms_delta is used by ia64-vms.  You could argue that
> > ia64-vms is a zombie and should be removed, but the general concern WRT
> > conditionally compiled code holds.
>
> Well, please let me install the patch as is and if somebody will need the
> functionality, I would be happy to put it back.

You could use contrib/config-list.mk to build all supported target configs.  You
shouldn't break builds for valid configs deliberately

> Thanks,
> Martin
>
> >
> > Jeff
> >
>
Jeff Law Sept. 25, 2018, 1:34 p.m. UTC | #4
On 9/25/18 6:19 AM, Richard Biener wrote:
> On Tue, Sep 25, 2018 at 9:09 AM Martin Liška <mliska@suse.cz> wrote:
>>
>> On 9/24/18 4:42 PM, Jeff Law wrote:
>>> On 9/22/18 1:08 PM, marxin wrote:
>>>>
>>>> gcc/ChangeLog:
>>>>
>>>> 2018-09-24  Martin Liska  <mliska@suse.cz>
>>>>
>>>>      * alias.c (set_dest_equal_p): Remove unused function.
>>>>      * config/i386/i386.c (def_builtin_pure2): Likewise.
>>>>      * diagnostic-show-locus.c (class layout): Remove
>>>>      unused field.
>>>>      (layout::layout): Likewise here.
>>>>      * dump-context.h (class temp_dump_context): Likewise.
>>>>      * dwarf2out.c (add_AT_fde_ref): Remove unused function.
>>>>      (add_AT_loclistsptr): Likewise.
>>>>      (add_AT_offset): Likewise.
>>>>      (get_AT_hi_pc): Likewise.
>>>>      (is_comdat_die): Likewise.
>>>>      (type_is_enum): Likewise.
>>>>      (ceiling): Likewise.
>>>>      (add_AT_vms_delta): Likewise.
>>>>      (is_class_die): Likewise.
>>>>      * edit-context.c (class line_event): Remove unused field.
>>>>      * graphite-sese-to-poly.c (tree_int_to_gmp): Remove
>>>>      unused function.
>>>>      * ipa-cp.c (ipa_get_vr_lat): Likewise.
>>>>      * lra-constraints.c (ok_for_index_p_nonstrict): Likewise.
>>>>      (ok_for_base_p_nonstrict): Likewise.
>>>>      * tree-chrec.c (is_not_constant_evolution): Likewise.
>>>>      (chrec_fold_poly_cst): Likewise.
>>>>      * tree-if-conv.c (has_pred_critical_p): Likewise.
>>>>      * tree-ssa-coalesce.c (print_exprs): Likewise.
>>>>      * tree-ssa-pre.c (bitmap_set_contains_expr): Likewise.
>>>>      * tree-ssa-uninit.c (is_and_or_or_p): Likewise.
>>>>      * tree-vrp.c (value_ranges_intersect_p): Likewise.
>>>>      (value_range_nonnegative_p): Likewise.
>>>>
>>>> gcc/cp/ChangeLog:
>>>>
>>>> 2018-09-24  Martin Liska  <mliska@suse.cz>
>>>>
>>>>      * name-lookup.c (namespace_scope_ht_size): Remove
>>>>      unused function.
>>>>      * parser.c (cp_lexer_next_token_is_not_keyword): Likewise.
>>>>
>>>> gcc/fortran/ChangeLog:
>>>>
>>>> 2018-09-24  Martin Liska  <mliska@suse.cz>
>>>>
>>>>      * trans.c (remove_suffix): Remove
>>>>      unused function.
>>>>
>>>> gcc/go/ChangeLog:
>>>>
>>>> 2018-09-24  Martin Liska  <mliska@suse.cz>
>>>>
>>>>      * gofrontend/escape.cc (Gogo::analyze_escape): Remove
>>>>      usage of a parameter.
>>>>      (Gogo::assign_connectivity): Likewise.
>>>>      (class Escape_analysis_tag): Likewise.
>>>>      (Gogo::tag_function): Likewise.
>>>>      * gofrontend/expressions.cc (Call_expression::do_type): Likewise.
>>>>      * gofrontend/gogo.h (class Gogo): Likewise.
>>>>      * gofrontend/types.cc (class Call_multiple_result_type): Likewise.
>>>>      (Type::make_call_multiple_result_type): Likewise.
>>>>      * gofrontend/types.h (class Type): Likewise.
>>>>      * gofrontend/wb.cc (class Check_escape): Likewise.
>>>>      (Gogo::add_write_barriers): Likewise.
>>> Note that some of these may be used inside conditional code.  For
>>> example the add_AT_vms_delta is used by ia64-vms.  You could argue that
>>> ia64-vms is a zombie and should be removed, but the general concern WRT
>>> conditionally compiled code holds.
>>
>> Well, please let me install the patch as is and if somebody will need the
>> functionality, I would be happy to put it back.
> 
> You could use contrib/config-list.mk to build all supported target configs.  You
> shouldn't break builds for valid configs deliberately
Right.  On a suitably large box it only takes a few hours.   Fire it off
at the end of the day and you've got results in the morning.

So how about this, if it passes config-list.mk then it's OK.   Obviously
it's OK to retain any functions that are flagged as necessary by
config-list.mk.

Alternately find + grep is your friend, but I find config-list.mk is better.

jeff
Martin Liška Sept. 26, 2018, 8:59 a.m. UTC | #5
On 9/25/18 3:34 PM, Jeff Law wrote:
> On 9/25/18 6:19 AM, Richard Biener wrote:
>> On Tue, Sep 25, 2018 at 9:09 AM Martin Liška <mliska@suse.cz> wrote:
>>>
>>> On 9/24/18 4:42 PM, Jeff Law wrote:
>>>> On 9/22/18 1:08 PM, marxin wrote:
>>>>>
>>>>> gcc/ChangeLog:
>>>>>
>>>>> 2018-09-24  Martin Liska  <mliska@suse.cz>
>>>>>
>>>>>      * alias.c (set_dest_equal_p): Remove unused function.
>>>>>      * config/i386/i386.c (def_builtin_pure2): Likewise.
>>>>>      * diagnostic-show-locus.c (class layout): Remove
>>>>>      unused field.
>>>>>      (layout::layout): Likewise here.
>>>>>      * dump-context.h (class temp_dump_context): Likewise.
>>>>>      * dwarf2out.c (add_AT_fde_ref): Remove unused function.
>>>>>      (add_AT_loclistsptr): Likewise.
>>>>>      (add_AT_offset): Likewise.
>>>>>      (get_AT_hi_pc): Likewise.
>>>>>      (is_comdat_die): Likewise.
>>>>>      (type_is_enum): Likewise.
>>>>>      (ceiling): Likewise.
>>>>>      (add_AT_vms_delta): Likewise.
>>>>>      (is_class_die): Likewise.
>>>>>      * edit-context.c (class line_event): Remove unused field.
>>>>>      * graphite-sese-to-poly.c (tree_int_to_gmp): Remove
>>>>>      unused function.
>>>>>      * ipa-cp.c (ipa_get_vr_lat): Likewise.
>>>>>      * lra-constraints.c (ok_for_index_p_nonstrict): Likewise.
>>>>>      (ok_for_base_p_nonstrict): Likewise.
>>>>>      * tree-chrec.c (is_not_constant_evolution): Likewise.
>>>>>      (chrec_fold_poly_cst): Likewise.
>>>>>      * tree-if-conv.c (has_pred_critical_p): Likewise.
>>>>>      * tree-ssa-coalesce.c (print_exprs): Likewise.
>>>>>      * tree-ssa-pre.c (bitmap_set_contains_expr): Likewise.
>>>>>      * tree-ssa-uninit.c (is_and_or_or_p): Likewise.
>>>>>      * tree-vrp.c (value_ranges_intersect_p): Likewise.
>>>>>      (value_range_nonnegative_p): Likewise.
>>>>>
>>>>> gcc/cp/ChangeLog:
>>>>>
>>>>> 2018-09-24  Martin Liska  <mliska@suse.cz>
>>>>>
>>>>>      * name-lookup.c (namespace_scope_ht_size): Remove
>>>>>      unused function.
>>>>>      * parser.c (cp_lexer_next_token_is_not_keyword): Likewise.
>>>>>
>>>>> gcc/fortran/ChangeLog:
>>>>>
>>>>> 2018-09-24  Martin Liska  <mliska@suse.cz>
>>>>>
>>>>>      * trans.c (remove_suffix): Remove
>>>>>      unused function.
>>>>>
>>>>> gcc/go/ChangeLog:
>>>>>
>>>>> 2018-09-24  Martin Liska  <mliska@suse.cz>
>>>>>
>>>>>      * gofrontend/escape.cc (Gogo::analyze_escape): Remove
>>>>>      usage of a parameter.
>>>>>      (Gogo::assign_connectivity): Likewise.
>>>>>      (class Escape_analysis_tag): Likewise.
>>>>>      (Gogo::tag_function): Likewise.
>>>>>      * gofrontend/expressions.cc (Call_expression::do_type): Likewise.
>>>>>      * gofrontend/gogo.h (class Gogo): Likewise.
>>>>>      * gofrontend/types.cc (class Call_multiple_result_type): Likewise.
>>>>>      (Type::make_call_multiple_result_type): Likewise.
>>>>>      * gofrontend/types.h (class Type): Likewise.
>>>>>      * gofrontend/wb.cc (class Check_escape): Likewise.
>>>>>      (Gogo::add_write_barriers): Likewise.
>>>> Note that some of these may be used inside conditional code.  For
>>>> example the add_AT_vms_delta is used by ia64-vms.  You could argue that
>>>> ia64-vms is a zombie and should be removed, but the general concern WRT
>>>> conditionally compiled code holds.
>>>
>>> Well, please let me install the patch as is and if somebody will need the
>>> functionality, I would be happy to put it back.
>>
>> You could use contrib/config-list.mk to build all supported target configs.  You
>> shouldn't break builds for valid configs deliberately
> Right.  On a suitably large box it only takes a few hours.   Fire it off
> at the end of the day and you've got results in the morning.
> 
> So how about this, if it passes config-list.mk then it's OK.   Obviously
> it's OK to retain any functions that are flagged as necessary by
> config-list.mk.
> 
> Alternately find + grep is your friend, but I find config-list.mk is better.
> 
> jeff
> 

Ok, next time I would be more careful about testing of other targets.

Thanks,
Martin
Bernhard Reutner-Fischer Sept. 27, 2018, 11:13 a.m. UTC | #6
On Wed, 26 Sep 2018 10:59:02 +0200
Martin Liška <mliska@suse.cz> wrote:

> On 9/25/18 3:34 PM, Jeff Law wrote:
> > On 9/25/18 6:19 AM, Richard Biener wrote:  
> >> On Tue, Sep 25, 2018 at 9:09 AM Martin Liška <mliska@suse.cz>
> >> wrote:  
> >>>
> >>> On 9/24/18 4:42 PM, Jeff Law wrote:  
> >>>> On 9/22/18 1:08 PM, marxin wrote:  
> >>>>>
> >>>>> gcc/ChangeLog:
> >>>>>
> >>>>> 2018-09-24  Martin Liska  <mliska@suse.cz>
> >>>>>
> >>>>>      * alias.c (set_dest_equal_p): Remove unused function.
> >>>>>      * config/i386/i386.c (def_builtin_pure2): Likewise.
> >>>>>      * diagnostic-show-locus.c (class layout): Remove
> >>>>>      unused field.
> >>>>>      (layout::layout): Likewise here.
> >>>>>      * dump-context.h (class temp_dump_context): Likewise.
> >>>>>      * dwarf2out.c (add_AT_fde_ref): Remove unused function.
> >>>>>      (add_AT_loclistsptr): Likewise.
> >>>>>      (add_AT_offset): Likewise.
> >>>>>      (get_AT_hi_pc): Likewise.
> >>>>>      (is_comdat_die): Likewise.
> >>>>>      (type_is_enum): Likewise.
> >>>>>      (ceiling): Likewise.
> >>>>>      (add_AT_vms_delta): Likewise.
> >>>>>      (is_class_die): Likewise.
> >>>>>      * edit-context.c (class line_event): Remove unused field.
> >>>>>      * graphite-sese-to-poly.c (tree_int_to_gmp): Remove
> >>>>>      unused function.
> >>>>>      * ipa-cp.c (ipa_get_vr_lat): Likewise.
> >>>>>      * lra-constraints.c (ok_for_index_p_nonstrict): Likewise.
> >>>>>      (ok_for_base_p_nonstrict): Likewise.
> >>>>>      * tree-chrec.c (is_not_constant_evolution): Likewise.
> >>>>>      (chrec_fold_poly_cst): Likewise.
> >>>>>      * tree-if-conv.c (has_pred_critical_p): Likewise.
> >>>>>      * tree-ssa-coalesce.c (print_exprs): Likewise.
> >>>>>      * tree-ssa-pre.c (bitmap_set_contains_expr): Likewise.
> >>>>>      * tree-ssa-uninit.c (is_and_or_or_p): Likewise.
> >>>>>      * tree-vrp.c (value_ranges_intersect_p): Likewise.
> >>>>>      (value_range_nonnegative_p): Likewise.
> >>>>>
> >>>>> gcc/cp/ChangeLog:
> >>>>>
> >>>>> 2018-09-24  Martin Liska  <mliska@suse.cz>
> >>>>>
> >>>>>      * name-lookup.c (namespace_scope_ht_size): Remove
> >>>>>      unused function.
> >>>>>      * parser.c (cp_lexer_next_token_is_not_keyword): Likewise.
> >>>>>
> >>>>> gcc/fortran/ChangeLog:
> >>>>>
> >>>>> 2018-09-24  Martin Liska  <mliska@suse.cz>
> >>>>>
> >>>>>      * trans.c (remove_suffix): Remove
> >>>>>      unused function.
> >>>>>
> >>>>> gcc/go/ChangeLog:
> >>>>>
> >>>>> 2018-09-24  Martin Liska  <mliska@suse.cz>
> >>>>>
> >>>>>      * gofrontend/escape.cc (Gogo::analyze_escape): Remove
> >>>>>      usage of a parameter.
> >>>>>      (Gogo::assign_connectivity): Likewise.
> >>>>>      (class Escape_analysis_tag): Likewise.
> >>>>>      (Gogo::tag_function): Likewise.
> >>>>>      * gofrontend/expressions.cc (Call_expression::do_type):
> >>>>> Likewise.
> >>>>>      * gofrontend/gogo.h (class Gogo): Likewise.
> >>>>>      * gofrontend/types.cc (class Call_multiple_result_type):
> >>>>> Likewise. (Type::make_call_multiple_result_type): Likewise.
> >>>>>      * gofrontend/types.h (class Type): Likewise.
> >>>>>      * gofrontend/wb.cc (class Check_escape): Likewise.
> >>>>>      (Gogo::add_write_barriers): Likewise.  
> >>>> Note that some of these may be used inside conditional code.  For
> >>>> example the add_AT_vms_delta is used by ia64-vms.  You could
> >>>> argue that ia64-vms is a zombie and should be removed, but the
> >>>> general concern WRT conditionally compiled code holds.  
> >>>
> >>> Well, please let me install the patch as is and if somebody will
> >>> need the functionality, I would be happy to put it back.  
> >>
> >> You could use contrib/config-list.mk to build all supported target
> >> configs.  You shouldn't break builds for valid configs
> >> deliberately  
> > Right.  On a suitably large box it only takes a few hours.   Fire
> > it off at the end of the day and you've got results in the morning.
> > 
> > So how about this, if it passes config-list.mk then it's OK.
> > Obviously it's OK to retain any functions that are flagged as
> > necessary by config-list.mk.
> > 
> > Alternately find + grep is your friend, but I find config-list.mk
> > is better.
> > 
> > jeff
> >   
> 
> Ok, next time I would be more careful about testing of other targets.
> 
> Thanks,
> Martin

Although not perfect, but may i suggest to consider putting the
attached contrib/unused_functions.py into our tree?

Just for fun i'm attaching output for fortran, c, cp as per the
"Examples" comment in the header of the script.

sample line for cp:
gcc/cp/cvt.o: Symbol 'cp_get_callee_fndecl(tree_node*)' declared extern but never referenced externally

sample for c:
gcc/c/c-decl.o: Symbol 'pending_invalid_xref_location' declared extern but never referenced externally
gcc/c/c-decl.o: Symbol 'pending_invalid_xref' declared extern but never referenced externally

I may find time to take care of the fortran spots later on, fwiw.

As per the comment inline, one could add support for extracting
archive-members. This would allow to optionally put the script
near the actual linking of e.g the compilers to see unwarranted extern
symbols quickly. But OTOH maybe that's a bit too much. :)

HTH
PS: I have to admit that flagging unused fields is a nice thing. Does
somebody know of an existing gcc plugin that does that? Or a secret LTO
knob to track or flag these?
#!/usr/bin/env python
#
# Copyright (c) 2018 Bernhard Reutner-Fischer
# Inspired by bloat-o-meter from busybox.

# This software may be used and distributed according to the terms and
# conditions of the GNU General Public License as published by the Free
# Software Foundation.

# Examples:
# unused_functions.py ./gcc/fortran
# unused_functions.py gcc/c  gcc/c-family/ gcc/*-c.o | egrep -v "'gt_"
# unused_functions.py gcc/cp gcc/c-family/ gcc/*-c.o | egrep -v "'gt_"

import sys, os

def usage():
    sys.stderr.write("usage: %s [dirs | files] [-- <readelf options>]\n"
                        % sys.argv[0])
    sys.exit(1)

(odir, sym_args) = (set(), "")

for i in range(1, len(sys.argv)):
    f = sys.argv[i]
    if f == "--": # sym_args
        sym_args = " ".join(sys.argv[i + 1:])
        break
    if not os.path.exists(f):
        sys.stderr.write("Error: No such file or directory '%s'\n" % f)
        usage()
    else:
        odir.add(f)

def get_symbols(file):
    syms = {}
    for l in os.popen("readelf -W -s %s %s | c++filt" % (sym_args, file)).readlines():
        l = l.strip()
        if not (len(l) and l[0].isdigit() and len(l.split()) == 8):
            continue
        num, value, size, typ, bind, vis, ndx, name = l.split()
        if typ == 'SECTION' or typ == 'FILE': continue
        # I don't think we have many aliases in gcc, re-instate the addr
        # lut otherwise.
        if vis != "DEFAULT": continue
        #value = int(value, 16)
        #size = int(size, 16) if size.startswith('0x') else int(size)
        defined = ndx != "UND"
        globl = bind == "GLOBAL"
        # c++ RID_FUNCTION_NAME dance. FORNOW: Handled as local use
        # Is that correct?
        if name.endswith("::__FUNCTION__") and typ == "OBJECT":
            name = name[0:(len(name) - len("::__FUNCTION__"))]
            if defined: defined = False # that can't be right...
        if defined and not globl: continue
        syms.setdefault(name, {})
        syms[name][["use","def"][defined]] = True
        syms[name][["local","global"][globl]] = True
    # Note: we could filter out e.g. debug_* symbols by looking for
    # value in the debug_macro sections.
    return syms

(oprog, nprog) = ({}, {})

def walker(paths):
    prog = {}
    for path in paths:
        if os.path.isdir(path):
            for r, dirs, files in os.walk(path):
                for f in files:
                    # TODO: maybe extract .a
                    if not f.endswith(".o"): continue
                    p = os.path.join(r, f)
                    prog[os.path.normpath(p)] = get_symbols(p)
                for d in dirs:
                    tem = prog.copy()
                    tem.update(walker([os.path.join(r, d)]))
                    prog = tem
        else:
            prog[os.path.normpath(path)] = get_symbols(path)
    return prog

def resolve(prog):
    x = prog.keys()
    use = set()
    # for each unique pair of different files
    for (f, g) in ((f,g) for f in x for g in x if f != g):
        refs = set()
        # for each defined symbol
        #for s in (s for s in prog[f] if prog[f][s] and s not in use
        #  and s in prog[g]):
        for s in (s for s in prog[f] if prog[f][s].get("def") and s in prog[g]):
            #if prog[g][s].get("def") and prog[g][s].get("global"):
            #    print("Error: Duplicate global %s in %s and %s" % (s, f, g))
            #elif prog[g][s].get("use"):
            if prog[g][s].get("use"):
                refs.add(s)
        for s in refs:
            for i in (i for i in x if s in prog[i]): del prog[i][s]
        use |= refs
    return use

oprog = walker(odir)
oused = resolve(oprog)
for (i,s) in ((i,s) for i in oprog.keys() for s in oprog[i] if oprog[i][s]):
    if oprog[i][s].get("def") and not oprog[i][s].get("use"):
        print("%s: Symbol '%s' declared extern but never referenced externally"
            % (i,s))
#print("Done.");
gcc/fortran/resolve.o: Symbol 'gfc_elemental(gfc_symbol*)' declared extern but never referenced externally
gcc/fortran/f95-lang.o: Symbol 'gt_pch_nx_lang_type(void*)' declared extern but never referenced externally
gcc/fortran/f95-lang.o: Symbol 'gt_ggc_r_gtype_fortran_h' declared extern but never referenced externally
gcc/fortran/f95-lang.o: Symbol 'gt_pch_nx_binding_level(void*)' declared extern but never referenced externally
gcc/fortran/f95-lang.o: Symbol 'gt_ggc_mx(module_htab_entry&)' declared extern but never referenced externally
gcc/fortran/f95-lang.o: Symbol 'gt_pch_nx_hash_table_module_decl_hasher_(void*)' declared extern but never referenced externally
gcc/fortran/f95-lang.o: Symbol 'gt_ggc_mx_module_htab_entry(void*)' declared extern but never referenced externally
gcc/fortran/f95-lang.o: Symbol 'gt_pch_nx_lang_decl(void*)' declared extern but never referenced externally
gcc/fortran/f95-lang.o: Symbol 'gt_pch_rs_gtype_fortran_h' declared extern but never referenced externally
gcc/fortran/f95-lang.o: Symbol 'gt_pch_nx(module_htab_entry&)' declared extern but never referenced externally
gcc/fortran/f95-lang.o: Symbol 'gt_ggc_mx_hash_table_module_decl_hasher_(void*)' declared extern but never referenced externally
gcc/fortran/f95-lang.o: Symbol 'gt_ggc_mx(module_decl_hasher&)' declared extern but never referenced externally
gcc/fortran/f95-lang.o: Symbol 'gt_ggc_r_gt_fortran_f95_lang_h' declared extern but never referenced externally
gcc/fortran/f95-lang.o: Symbol 'gt_ggc_deletable_rtab' declared extern but never referenced externally
gcc/fortran/f95-lang.o: Symbol 'gt_ggc_mx_language_function(void*)' declared extern but never referenced externally
gcc/fortran/f95-lang.o: Symbol 'gt_pch_nx(module_decl_hasher&)' declared extern but never referenced externally
gcc/fortran/f95-lang.o: Symbol 'gt_pch_scalar_rtab' declared extern but never referenced externally
gcc/fortran/f95-lang.o: Symbol 'gt_ggc_rtab' declared extern but never referenced externally
gcc/fortran/f95-lang.o: Symbol 'gt_pch_nx_language_function(void*)' declared extern but never referenced externally
gcc/fortran/f95-lang.o: Symbol 'gt_ggc_mx_binding_level(void*)' declared extern but never referenced externally
gcc/fortran/f95-lang.o: Symbol 'gt_ggc_mx_lang_decl(void*)' declared extern but never referenced externally
gcc/fortran/f95-lang.o: Symbol 'gt_clear_caches()' declared extern but never referenced externally
gcc/fortran/f95-lang.o: Symbol 'gt_ggc_mx_lang_type(void*)' declared extern but never referenced externally
gcc/fortran/f95-lang.o: Symbol 'gt_pch_nx_module_htab_entry(void*)' declared extern but never referenced externally
gcc/fortran/module.o: Symbol 'mio_symbol_ref(gfc_symbol**)' declared extern but never referenced externally
gcc/fortran/module.o: Symbol 'mio_interface_rest(gfc_interface**)' declared extern but never referenced externally
gcc/fortran/class.o: Symbol 'gfc_intrinsic_hash_value(gfc_typespec*)' declared extern but never referenced externally
gcc/fortran/decl.o: Symbol 'gfc_insert_kind_parameter_exprs(gfc_expr*)' declared extern but never referenced externally
gcc/fortran/decl.o: Symbol 'gfc_match_old_kind_spec(gfc_typespec*)' declared extern but never referenced externally
gcc/fortran/decl.o: Symbol 'gfc_mod_pointee_as(gfc_array_spec*)' declared extern but never referenced externally
gcc/fortran/decl.o: Symbol 'get_bind_c_idents()' declared extern but never referenced externally
gcc/fortran/decl.o: Symbol 'gfc_match_null(gfc_expr**)' declared extern but never referenced externally
gcc/fortran/expr.o: Symbol 'is_non_empty_structure_constructor(gfc_expr*)' declared extern but never referenced externally
gcc/fortran/gfortranspec.o: Symbol 'lang_specific_pre_link()' declared extern but never referenced externally
gcc/fortran/gfortranspec.o: Symbol 'lang_specific_extra_outfiles' declared extern but never referenced externally
gcc/fortran/trans.o: Symbol 'gfc_msg_wrong_return' declared extern but never referenced externally
gcc/fortran/symbol.o: Symbol 'gfc_get_ultimate_derived_super_type(gfc_symbol*)' declared extern but never referenced externally
gcc/fortran/primary.o: Symbol 'matching_actual_arglist' declared extern but never referenced externally
gcc/fortran/simplify.o: Symbol 'simplify_ieee_support(gfc_expr*)' declared extern but never referenced externally
gcc/fortran/simplify.o: Symbol 'simplify_ieee_selected_real_kind(gfc_expr*)' declared extern but never referenced externally
gcc/fortran/simplify.o: Symbol 'gfc_simplify_get_team(gfc_expr*)' declared extern but never referenced externally
gcc/fortran/trans-types.o: Symbol 'gfc_check_any_c_kind(gfc_typespec*)' declared extern but never referenced externally
gcc/fortran/trans-types.o: Symbol 'gfc_get_ppc_type(gfc_component*)' declared extern but never referenced externally
gcc/fortran/trans-types.o: Symbol 'dtype_type_node' declared extern but never referenced externally
gcc/fortran/trans-types.o: Symbol 'pfunc_type_node' declared extern but never referenced externally
gcc/fortran/dump-parse-tree.o: Symbol 'gfc_debug_code(gfc_code*)' declared extern but never referenced externally
gcc/fortran/dump-parse-tree.o: Symbol 'gfc_debug_expr(gfc_expr*)' declared extern but never referenced externally
gcc/fortran/trans-decl.o: Symbol 'gt_ggc_mx_hash_table_module_hasher_(void*)' declared extern but never referenced externally
gcc/fortran/trans-decl.o: Symbol 'gfor_fndecl_set_args' declared extern but never referenced externally
gcc/fortran/trans-decl.o: Symbol 'gt_pch_nx_hash_table_module_hasher_(void*)' declared extern but never referenced externally
gcc/fortran/trans-decl.o: Symbol 'gfor_fndecl_set_max_subrecord_length' declared extern but never referenced externally
gcc/fortran/trans-decl.o: Symbol 'gfor_fndecl_set_convert' declared extern but never referenced externally
gcc/fortran/trans-decl.o: Symbol 'gt_pch_nx(module_hasher&)' declared extern but never referenced externally
gcc/fortran/trans-decl.o: Symbol 'gfor_fndecl_set_record_marker' declared extern but never referenced externally
gcc/fortran/trans-decl.o: Symbol 'gt_ggc_mx(module_hasher&)' declared extern but never referenced externally
gcc/fortran/match.o: Symbol 'type_param_spec_list' declared extern but never referenced externally
gcc/fortran/match.o: Symbol 'gfc_match_label()' declared extern but never referenced externally
gcc/fortran/trans-expr.o: Symbol 'gfc_class_vtab_hash_get(tree_node*)' declared extern but never referenced externally
gcc/fortran/trans-expr.o: Symbol 'gfc_class_vtab_extends_get(tree_node*)' declared extern but never referenced externally
gcc/fortran/trans-expr.o: Symbol 'gfc_class_vtab_deallocate_get(tree_node*)' declared extern but never referenced externally
gcc/fortran/trans-expr.o: Symbol 'gfc_vptr_def_init_get(tree_node*)' declared extern but never referenced externally
gcc/fortran/trans-expr.o: Symbol 'gfc_vptr_hash_get(tree_node*)' declared extern but never referenced externally
gcc/fortran/trans-expr.o: Symbol 'gfc_vptr_final_get(tree_node*)' declared extern but never referenced externally
gcc/fortran/trans-expr.o: Symbol 'gfc_class_vtab_def_init_get(tree_node*)' declared extern but never referenced externally
gcc/fortran/trans-expr.o: Symbol 'gfc_vptr_copy_get(tree_node*)' declared extern but never referenced externally
gcc/fortran/trans-expr.o: Symbol 'gfc_class_vtab_copy_get(tree_node*)' declared extern but never referenced externally
gcc/fortran/trans-expr.o: Symbol 'gfc_vptr_extends_get(tree_node*)' declared extern but never referenced externally
gcc/fortran/constructor.o: Symbol 'gfc_constructor_get_base()' declared extern but never referenced externally
gcc/fortran/scanner.o: Symbol 'file_changes_count' declared extern but never referenced externally
gcc/fortran/scanner.o: Symbol 'file_changes_allocated' declared extern but never referenced externally
gcc/fortran/scanner.o: Symbol 'file_changes_cur' declared extern but never referenced externally
gcc/fortran/frontend-passes.o: Symbol 'evec' declared extern but never referenced externally
gcc/fortran/frontend-passes.o: Symbol 'stack_top' declared extern but never referenced externally
gcc/fortran/frontend-passes.o: Symbol 'n_vars' declared extern but never referenced externally
gcc/fortran/trans-openmp.o: Symbol 'gfc_trans_oacc_declare(gfc_code*)' declared extern but never referenced externally
gcc/fortran/cpp.o: Symbol 'gfc_cpp_register_include_paths()' declared extern but never referenced externally
gcc/fortran/cpp.o: Symbol 'gfc_cpp_option' declared extern but never referenced externally
gcc/fortran/openmp.o: Symbol 'gfc_free_omp_declare_simd(gfc_omp_declare_simd*)' declared extern but never referenced externally
gcc/fortran/openmp.o: Symbol 'gfc_free_expr_list(gfc_expr_list*)' declared extern but never referenced externally
gcc/c-family/c-format.o: Symbol 'argument_parser::read_any_length_modifier()' declared extern but never referenced externally
gcc/c-family/c-format.o: Symbol 'flag_chars_t::flag_chars_t()' declared extern but never referenced externally
gcc/c-family/c-format.o: Symbol 'flag_chars_t::add_char(char)' declared extern but never referenced externally
gcc/c-family/c-format.o: Symbol 'argument_parser::read_any_format_left_precision()' declared extern but never referenced externally
gcc/c-family/c-format.o: Symbol 'argument_parser::find_format_char_info(char)' declared extern but never referenced externally
gcc/c-family/c-format.o: Symbol 'argument_parser::read_any_other_modifier()' declared extern but never referenced externally
gcc/c-family/c-format.o: Symbol 'argument_parser::read_any_dollar()' declared extern but never referenced externally
gcc/c-family/c-format.o: Symbol 'argument_parser::handle_alloc_chars()' declared extern but never referenced externally
gcc/c-family/c-format.o: Symbol 'argument_parser::read_format_flags()' declared extern but never referenced externally
gcc/c-family/c-lex.o: Symbol 'c_header_level' declared extern but never referenced externally
gcc/c-family/c-lex.o: Symbol 'dump_time_statistics()' declared extern but never referenced externally
gcc/c-family/c-pch.o: Symbol 'lang_post_pch_load' declared extern but never referenced externally
gcc/c-family/c-pretty-print.o: Symbol 'debug_c_tree(tree_node*)' declared extern but never referenced externally
gcc/c-family/c-pretty-print.o: Symbol 'pp_c_complement(c_pretty_printer*)' declared extern but never referenced externally
gcc/c-family/c-pretty-print.o: Symbol 'pp_c_left_brace(c_pretty_printer*)' declared extern but never referenced externally
gcc/c-family/c-pretty-print.o: Symbol 'pp_c_exclamation(c_pretty_printer*)' declared extern but never referenced externally
gcc/c-family/c-pretty-print.o: Symbol 'c_pretty_printer::initializer(tree_node*)' declared extern but never referenced externally
gcc/c-family/c-pretty-print.o: Symbol 'pp_c_right_brace(c_pretty_printer*)' declared extern but never referenced externally
gcc/c-family/c-pretty-print.o: Symbol 'pp_c_star(c_pretty_printer*)' declared extern but never referenced externally
gcc/c-family/c-pretty-print.o: Symbol 'pp_c_left_paren(c_pretty_printer*)' declared extern but never referenced externally
gcc/c-family/c-pretty-print.o: Symbol 'pp_c_ampersand(c_pretty_printer*)' declared extern but never referenced externally
gcc/c-family/c-pretty-print.o: Symbol 'c_pretty_printer::declaration(tree_node*)' declared extern but never referenced externally
gcc/c-family/c-pretty-print.o: Symbol 'pp_c_right_bracket(c_pretty_printer*)' declared extern but never referenced externally
gcc/c-family/c-pretty-print.o: Symbol 'c_pretty_printer::statement(tree_node*)' declared extern but never referenced externally
gcc/c-family/c-pretty-print.o: Symbol 'pp_c_dot(c_pretty_printer*)' declared extern but never referenced externally
gcc/c-family/c-pretty-print.o: Symbol 'pp_c_left_bracket(c_pretty_printer*)' declared extern but never referenced externally
gcc/c-family/c-pretty-print.o: Symbol 'pp_c_arrow(c_pretty_printer*)' declared extern but never referenced externally
gcc/c-family/c-pretty-print.o: Symbol 'pp_c_semicolon(c_pretty_printer*)' declared extern but never referenced externally
gcc/c-family/c-pretty-print.o: Symbol 'pp_c_right_paren(c_pretty_printer*)' declared extern but never referenced externally
gcc/c-family/known-headers.o: Symbol 'suggest_missing_header::~suggest_missing_header()' declared extern but never referenced externally
gcc/c-family/stub-objc.o: Symbol 'objc_generate_static_init_call(tree_node*)' declared extern but never referenced externally
gcc/c-family/stub-objc.o: Symbol 'objc_static_init_needed_p()' declared extern but never referenced externally
gcc/c-family/stub-objc.o: Symbol 'objc_is_id(tree_node*)' declared extern but never referenced externally
gcc/c-family/c-common.o: Symbol 'keyword_is_decl_specifier(rid)' declared extern but never referenced externally
gcc/c-family/c-common.o: Symbol 'keyword_is_type_qualifier(rid)' declared extern but never referenced externally
gcc/c-family/c-common.o: Symbol 'registered_builtin_types' declared extern but never referenced externally
gcc/c-family/c-common.o: Symbol 'done_lexing' declared extern but never referenced externally
gcc/c-family/c-common.o: Symbol 'keyword_is_storage_class_specifier(rid)' declared extern but never referenced externally
gcc/c-family/c-common.o: Symbol 'keyword_begins_type_specifier(rid)' declared extern but never referenced externally
gcc/c-family/c-common.o: Symbol 'make_tree_vector_single(tree_node*)' declared extern but never referenced externally
gcc/c/c-decl.o: Symbol 'objc_mark_locals_volatile(void*)' declared extern but never referenced externally
gcc/c/c-decl.o: Symbol 'pending_invalid_xref_location' declared extern but never referenced externally
gcc/c/c-decl.o: Symbol 'pending_invalid_xref' declared extern but never referenced externally
gcc/c/c-decl.o: Symbol 'objc_get_current_scope()' declared extern but never referenced externally
gcc/c/c-decl.o: Symbol 'store_parm_decls_from(c_arg_info*)' declared extern but never referenced externally
gcc/c/c-decl.o: Symbol 'c_binding_oracle' declared extern but never referenced externally
gcc/c/gccspec.o: Symbol 'lang_specific_pre_link()' declared extern but never referenced externally
gcc/c/gccspec.o: Symbol 'lang_specific_extra_outfiles' declared extern but never referenced externally
gcc/c/c-lang.o: Symbol 'selftest::run_c_tests()' declared extern but never referenced externally
gcc/c-family/c-attribs.o: Symbol 'tm_attr_to_mask(tree_node*)' declared extern but never referenced externally
gcc/c-family/c-pragma.o: Symbol 'pop_visibility(int)' declared extern but never referenced externally
gcc/c-family/c-pragma.o: Symbol 'pragma_extern_prefix' declared extern but never referenced externally
gcc/c/c-parser.o: Symbol 'matching_paren_traits::open_gmsgid' declared extern but never referenced externally
gcc/c/c-parser.o: Symbol 'matching_paren_traits::close_gmsgid' declared extern but never referenced externally
gcc/c/c-parser.o: Symbol 'matching_brace_traits::close_gmsgid' declared extern but never referenced externally
gcc/c/c-parser.o: Symbol 'matching_brace_traits::open_gmsgid' declared extern but never referenced externally
gcc/c-family/c-opts.o: Symbol 'c_family_lang_mask' declared extern but never referenced externally
gcc/c-family/cppspec.o: Symbol 'lang_specific_pre_link()' declared extern but never referenced externally
gcc/c-family/cppspec.o: Symbol 'lang_specific_extra_outfiles' declared extern but never referenced externally
gcc/c-family/c-format.o: Symbol 'argument_parser::read_any_length_modifier()' declared extern but never referenced externally
gcc/c-family/c-format.o: Symbol 'flag_chars_t::flag_chars_t()' declared extern but never referenced externally
gcc/c-family/c-format.o: Symbol 'flag_chars_t::add_char(char)' declared extern but never referenced externally
gcc/c-family/c-format.o: Symbol 'argument_parser::read_any_format_left_precision()' declared extern but never referenced externally
gcc/c-family/c-format.o: Symbol 'argument_parser::find_format_char_info(char)' declared extern but never referenced externally
gcc/c-family/c-format.o: Symbol 'argument_parser::read_any_other_modifier()' declared extern but never referenced externally
gcc/c-family/c-format.o: Symbol 'argument_parser::read_any_dollar()' declared extern but never referenced externally
gcc/c-family/c-format.o: Symbol 'argument_parser::handle_alloc_chars()' declared extern but never referenced externally
gcc/c-family/c-format.o: Symbol 'argument_parser::read_format_flags()' declared extern but never referenced externally
gcc/cp/constraint.o: Symbol 'constraint_thresh' declared extern but never referenced externally
gcc/cp/constraint.o: Symbol 'constraint_errors' declared extern but never referenced externally
gcc/c-family/c-lex.o: Symbol 'c_header_level' declared extern but never referenced externally
gcc/cp/g++spec.o: Symbol 'lang_specific_extra_outfiles' declared extern but never referenced externally
gcc/cp/g++spec.o: Symbol 'lang_specific_pre_link()' declared extern but never referenced externally
gcc/cp/ptree.o: Symbol 'debug_tree(cp_expr)' declared extern but never referenced externally
gcc/cp/cvt.o: Symbol 'cp_get_callee_fndecl(tree_node*)' declared extern but never referenced externally
gcc/cp/lex.o: Symbol 'init_reswords()' declared extern but never referenced externally
gcc/c-family/known-headers.o: Symbol 'suggest_missing_header::~suggest_missing_header()' declared extern but never referenced externally
gcc/c-family/stub-objc.o: Symbol 'objc_check_global_decl(tree_node*)' declared extern but never referenced externally
gcc/c-family/stub-objc.o: Symbol 'objc_detect_field_duplicates(bool)' declared extern but never referenced externally
gcc/c-family/stub-objc.o: Symbol 'objc_check_decl(tree_node*)' declared extern but never referenced externally
gcc/cp/except.o: Symbol 'eh_type_info(tree_node*)' declared extern but never referenced externally
gcc/cp/parser.o: Symbol 'debug(cp_token&)' declared extern but never referenced externally
gcc/cp/parser.o: Symbol 'debug(cp_token*)' declared extern but never referenced externally
gcc/cp/parser.o: Symbol 'debug(cp_parser*)' declared extern but never referenced externally
gcc/cp/parser.o: Symbol 'no_parameters' declared extern but never referenced externally
gcc/cp/parser.o: Symbol 'debug(cp_parser&)' declared extern but never referenced externally
gcc/c-family/c-common.o: Symbol 'c_default_pointer_mode' declared extern but never referenced externally
gcc/c-family/c-common.o: Symbol 'c_common_init_ts()' declared extern but never referenced externally
gcc/c-family/c-common.o: Symbol 'keyword_is_type_qualifier(rid)' declared extern but never referenced externally
gcc/c-family/c-common.o: Symbol 'keyword_is_storage_class_specifier(rid)' declared extern but never referenced externally
gcc/cp/decl.o: Symbol 'objc_get_current_scope()' declared extern but never referenced externally
gcc/c-family/c-pragma.o: Symbol 'pragma_extern_prefix' declared extern but never referenced externally
gcc/c-family/c-pragma.o: Symbol 'valid_location_for_stdc_pragma_p()' declared extern but never referenced externally
gcc/c-family/c-pragma.o: Symbol 'mark_valid_location_for_stdc_pragma(bool)' declared extern but never referenced externally
gcc/cp/tree.o: Symbol 'verify_stmt_tree(tree_node*)' declared extern but never referenced externally
gcc/cp/tree.o: Symbol 'count_trees(tree_node*)' declared extern but never referenced externally
gcc/cp/vtable-class-hierarchy.o: Symbol 'vtv_register_class_hierarchy_information(tree_node*)' declared extern but never referenced externally
gcc/cp/pt.o: Symbol 'tinst_level::refcount_infinity' declared extern but never referenced externally
gcc/cp/pt.o: Symbol 'spec_hasher::hash(spec_entry*)' declared extern but never referenced externally
gcc/cp/pt.o: Symbol 'depth_reached' declared extern but never referenced externally
gcc/cp/pt.o: Symbol 'tinst_level::free(tinst_level*)' declared extern but never referenced externally
gcc/c-family/c-pretty-print.o: Symbol 'debug_c_tree(tree_node*)' declared extern but never referenced externally
gcc/c-family/c-pretty-print.o: Symbol 'pp_c_exclamation(c_pretty_printer*)' declared extern but never referenced externally
gcc/c-family/c-pretty-print.o: Symbol 'pp_c_ampersand(c_pretty_printer*)' declared extern but never referenced externally
gcc/c-family/c-pretty-print.o: Symbol 'c_pretty_printer::declaration(tree_node*)' declared extern but never referenced externally
gcc/c-family/c-opts.o: Symbol 'c_family_lang_mask' declared extern but never referenced externally
gcc/cp/constexpr.o: Symbol 'is_static_init_expression(tree_node*)' declared extern but never referenced externally
gcc/cp/constexpr.o: Symbol 'is_constant_expression(tree_node*)' declared extern but never referenced externally
gcc/cp/cxx-pretty-print.o: Symbol 'cxx_pretty_printer::declarator(tree_node*)' declared extern but never referenced externally
gcc/cp/class.o: Symbol 'debug_thunks(tree_node*)' declared extern but never referenced externally
gcc/cp/class.o: Symbol 'debug_class(tree_node*)' declared extern but never referenced externally
gcc/cp/class.o: Symbol 'declared_access(tree_node*)' declared extern but never referenced externally
gcc/c-family/cppspec.o: Symbol 'lang_specific_pre_link()' declared extern but never referenced externally
gcc/c-family/cppspec.o: Symbol 'lang_specific_extra_outfiles' declared extern but never referenced externally
gcc/cp/name-lookup.o: Symbol 'name_lookup::shared_scopes' declared extern but never referenced externally
gcc/cp/name-lookup.o: Symbol 'debug(cp_binding_level&)' declared extern but never referenced externally
gcc/cp/name-lookup.o: Symbol 'name_lookup::active' declared extern but never referenced externally
gcc/cp/name-lookup.o: Symbol 'debug(cp_binding_level*)' declared extern but never referenced externally
gcc/cp/cp-lang.o: Symbol 'selftest::run_cp_tests()' declared extern but never referenced externally
Jeff Law Oct. 3, 2018, 4:42 p.m. UTC | #7
On 9/27/18 5:13 AM, Bernhard Reutner-Fischer wrote:

> 
> Although not perfect, but may i suggest to consider putting the
> attached contrib/unused_functions.py into our tree?
Do you have commit privileges?  If so, go ahead and add it.

> 
> Just for fun i'm attaching output for fortran, c, cp as per the
> "Examples" comment in the header of the script.
> 
> sample line for cp:
> gcc/cp/cvt.o: Symbol 'cp_get_callee_fndecl(tree_node*)' declared extern but never referenced externally
Seems like it could just go away.  I'd hazard a guess the introduction
of cp_get_callee_fndecl_nofold made cp_get_callee_fndecl unused and it
just wasn't caught at the time.

> 
> sample for c:
> gcc/c/c-decl.o: Symbol 'pending_invalid_xref_location' declared extern but never referenced externally
> gcc/c/c-decl.o: Symbol 'pending_invalid_xref' declared extern but never referenced externally
I think these are used internally within c-decl.c, so I think they just
need their linkage changed to static.

Anyone who wants to tackle those should consider the patch pre-approved.


Jeff
Bernhard Reutner-Fischer Oct. 3, 2018, 6:54 p.m. UTC | #8
On 3 October 2018 18:42:23 CEST, Jeff Law <law@redhat.com> wrote:
>On 9/27/18 5:13 AM, Bernhard Reutner-Fischer wrote:
>
>> 
>> Although not perfect, but may i suggest to consider putting the
>> attached contrib/unused_functions.py into our tree?
>Do you have commit privileges?  If so, go ahead and add it.

Yes I have and will add it.

>> Just for fun i'm attaching output for fortran, c, cp as per the
>> "Examples" comment in the header of the script.
>> 

>Anyone who wants to tackle those should consider the patch
>pre-approved.

I'm happy to leave the non-Fortran bits to whoever has time.

TIA :)
Bernhard Reutner-Fischer Oct. 4, 2018, 10:43 p.m. UTC | #9
Hi!

So i just added archive handling to ease looking at more than just the
plain frontends, applied as r264856.

You can now use the exact files passed to the driver when linking e.g. cc1.
We link libcommon.a twice? Didn't look.

e.g.:
me@there:.../gcc$ /scratch/src/gcc-trunk/contrib/unused_functions.py
c/c-lang.o c-family/stub-objc.o attribs.o c/c-errors.o c/c-decl.o
c/c-typeck.o c/c-convert.o c/c-aux-info.o c/c-objc-common.o
c/c-parser.o c/c-fold.o c/gimple-parser.o c-family/c-common.o
c-family/c-cppbuiltin.o c-family/c-dump.o c-family/c-format.o
c-family/c-gimplify.o c-family/c-indentation.o c-family/c-lex.o
c-family/c-omp.o c-family/c-opts.o c-family/c-pch.o
c-family/c-ppoutput.o c-family/c-pragma.o c-family/c-pretty-print.o
c-family/c-semantics.o c-family/c-ada-spec.o c-family/c-ubsan.o
c-family/known-headers.o c-family/c-attribs.o c-family/c-warn.o
c-family/c-spellcheck.o i386-c.o glibc-c.o   cc1-checksum.o
libbackend.a main.o libcommon-target.a libcommon.a ../libcpp/libcpp.a
../libdecnumber/libdecnumber.a libcommon.a ../libcpp/libcpp.a
../libbacktrace/.libs/libbacktrace.a ../libiberty/libiberty.a
../libdecnumber/libdecnumber.a

results in the attached output.

This properly flags functions like e.g.: init_branch_prob (dead code),
bitwise_mode_for_mode in stor-layout.c (should be static).

Of course it also complains about cases like supports_one_only() in cc1
where that is only used in cc1plus.
Likewise constant_pool_empty_p() on i386 which is only used by ppc and spe.

HTH,
Martin Liška Oct. 5, 2018, 1:14 p.m. UTC | #10
On 10/5/18 12:43 AM, Bernhard Reutner-Fischer wrote:
> Hi!
> 
> So i just added archive handling to ease looking at more than just the
> plain frontends, applied as r264856.

Running the tools for cc1 does not show anything. Please update the comment
in the script with example invocation.

> 
> You can now use the exact files passed to the driver when linking e.g. cc1.
> We link libcommon.a twice? Didn't look.
> 
> e.g.:
> me@there:.../gcc$ /scratch/src/gcc-trunk/contrib/unused_functions.py
> c/c-lang.o c-family/stub-objc.o attribs.o c/c-errors.o c/c-decl.o
> c/c-typeck.o c/c-convert.o c/c-aux-info.o c/c-objc-common.o
> c/c-parser.o c/c-fold.o c/gimple-parser.o c-family/c-common.o
> c-family/c-cppbuiltin.o c-family/c-dump.o c-family/c-format.o
> c-family/c-gimplify.o c-family/c-indentation.o c-family/c-lex.o
> c-family/c-omp.o c-family/c-opts.o c-family/c-pch.o
> c-family/c-ppoutput.o c-family/c-pragma.o c-family/c-pretty-print.o
> c-family/c-semantics.o c-family/c-ada-spec.o c-family/c-ubsan.o
> c-family/known-headers.o c-family/c-attribs.o c-family/c-warn.o
> c-family/c-spellcheck.o i386-c.o glibc-c.o   cc1-checksum.o
> libbackend.a main.o libcommon-target.a libcommon.a ../libcpp/libcpp.a
> ../libdecnumber/libdecnumber.a libcommon.a ../libcpp/libcpp.a
> ../libbacktrace/.libs/libbacktrace.a ../libiberty/libiberty.a
> ../libdecnumber/libdecnumber.a
> 
> results in the attached output.
> 
> This properly flags functions like e.g.: init_branch_prob (dead code),
> bitwise_mode_for_mode in stor-layout.c (should be static).
> 
> Of course it also complains about cases like supports_one_only() in cc1
> where that is only used in cc1plus.
> Likewise constant_pool_empty_p() on i386 which is only used by ppc and spe.
> 
> HTH,
> 

I'm not currently playing with alternative approach. As mentioned I run diagnostics
from rtags and it looks they added new functionality --find-dead-functions that
lists dead functions. It provides reasonable results, it finds also overloads of functions
and class member functions. Similarly I suggested to add --find-dead-variables:
https://github.com/Andersbakken/rtags/issues/1234
What's nice about it is that it can also find dead local variables, like:
gcc/tree-vect-loop.c:5875:34:	  widest_int ni, max_loop_value, lhs_max;
It's still WIP, needs to be done properly.

For the external symbols that can be turned into static, I created issue:
https://github.com/Andersbakken/rtags/issues/1235

I'm planning to prepare a patch that will remove the dead symbols.
Martin
Ian Lance Taylor Oct. 18, 2018, 11:02 p.m. UTC | #11
On Sat, Sep 22, 2018 at 12:08 PM, marxin <mliska@suse.cz> wrote:
>
> gcc/go/ChangeLog:
>
> 2018-09-24  Martin Liska  <mliska@suse.cz>
>
>         * gofrontend/escape.cc (Gogo::analyze_escape): Remove
>         usage of a parameter.
>         (Gogo::assign_connectivity): Likewise.
>         (class Escape_analysis_tag): Likewise.
>         (Gogo::tag_function): Likewise.
>         * gofrontend/expressions.cc (Call_expression::do_type): Likewise.
>         * gofrontend/gogo.h (class Gogo): Likewise.
>         * gofrontend/types.cc (class Call_multiple_result_type): Likewise.
>         (Type::make_call_multiple_result_type): Likewise.
>         * gofrontend/types.h (class Type): Likewise.
>         * gofrontend/wb.cc (class Check_escape): Likewise.
>         (Gogo::add_write_barriers): Likewise.

HI, unfortunately this is wrong.  As described in
gcc/go/gofrontend/README, the files in that directory are mirrored
from a separate repository (the same is true of the files in the libgo
directory).  You should not make changes to them directly in the GCC
repository.  I have reverted these changes, as follows.  Sorry.

Ian
Index: gcc/go/gofrontend/escape.cc
===================================================================
--- gcc/go/gofrontend/escape.cc	(revision 265293)
+++ gcc/go/gofrontend/escape.cc	(working copy)
@@ -979,7 +979,7 @@ Gogo::analyze_escape()
       for (std::vector<Named_object*>::iterator fn = stack.begin();
            fn != stack.end();
            ++fn)
-	this->tag_function(*fn);
+        this->tag_function(context, *fn);
 
       if (this->debug_escape_level() != 0)
 	{
@@ -1232,10 +1232,10 @@ Escape_analysis_loop::statement(Block*,
 class Escape_analysis_assign : public Traverse
 {
 public:
-  Escape_analysis_assign(Escape_context* context)
+  Escape_analysis_assign(Escape_context* context, Named_object* fn)
     : Traverse(traverse_statements
 	       | traverse_expressions),
-      context_(context)
+      context_(context), fn_(fn)
   { }
 
   // Model statements within a function as assignments and flows between nodes.
@@ -1272,6 +1272,8 @@ public:
 private:
   // The escape context for this set of functions.
   Escape_context* context_;
+  // The current function being analyzed.
+  Named_object* fn_;
 };
 
 // Helper function to detect self assignment like the following.
@@ -2702,7 +2704,7 @@ Gogo::assign_connectivity(Escape_context
   int save_depth = context->loop_depth();
   context->set_loop_depth(1);
 
-  Escape_analysis_assign ea(context);
+  Escape_analysis_assign ea(context, fn);
   Function::Results* res = fn->func_value()->result_variables();
   if (res != NULL)
     {
@@ -3265,13 +3267,17 @@ Gogo::propagate_escape(Escape_context* c
 class Escape_analysis_tag
 {
  public:
-  Escape_analysis_tag()
+  Escape_analysis_tag(Escape_context* context)
+    : context_(context)
   { }
 
   // Add notes to the function's type about the escape information of its
   // input parameters.
   void
   tag(Named_object* fn);
+
+ private:
+  Escape_context* context_;
 };
 
 void
@@ -3379,9 +3385,9 @@ Escape_analysis_tag::tag(Named_object* f
 // retain analysis results across imports.
 
 void
-Gogo::tag_function(Named_object* fn)
+Gogo::tag_function(Escape_context* context, Named_object* fn)
 {
-  Escape_analysis_tag eat;
+  Escape_analysis_tag eat(context);
   eat.tag(fn);
 }
 
Index: gcc/go/gofrontend/expressions.cc
===================================================================
--- gcc/go/gofrontend/expressions.cc	(revision 265293)
+++ gcc/go/gofrontend/expressions.cc	(working copy)
@@ -10108,7 +10108,7 @@ Call_expression::do_type()
   else if (results->size() == 1)
     ret = results->begin()->type();
   else
-    ret = Type::make_call_multiple_result_type();
+    ret = Type::make_call_multiple_result_type(this);
 
   this->type_ = ret;
 
Index: gcc/go/gofrontend/gogo.h
===================================================================
--- gcc/go/gofrontend/gogo.h	(revision 265287)
+++ gcc/go/gofrontend/gogo.h	(working copy)
@@ -680,7 +680,7 @@ class Gogo
   // Add notes about the escape level of a function's input and output
   // parameters for exporting and importing top level functions. 
   void
-  tag_function(Named_object*);
+  tag_function(Escape_context*, Named_object*);
 
   // Reclaim memory of escape analysis Nodes.
   void
Index: gcc/go/gofrontend/types.cc
===================================================================
--- gcc/go/gofrontend/types.cc	(revision 265293)
+++ gcc/go/gofrontend/types.cc	(working copy)
@@ -5441,8 +5441,9 @@ Type::make_nil_type()
 class Call_multiple_result_type : public Type
 {
  public:
-  Call_multiple_result_type()
-    : Type(TYPE_CALL_MULTIPLE_RESULT)
+  Call_multiple_result_type(Call_expression* call)
+    : Type(TYPE_CALL_MULTIPLE_RESULT),
+      call_(call)
   { }
 
  protected:
@@ -5475,14 +5476,18 @@ class Call_multiple_result_type : public
   void
   do_mangled_name(Gogo*, std::string*) const
   { go_assert(saw_errors()); }
+
+ private:
+  // The expression being called.
+  Call_expression* call_;
 };
 
 // Make a call result type.
 
 Type*
-Type::make_call_multiple_result_type()
+Type::make_call_multiple_result_type(Call_expression* call)
 {
-  return new Call_multiple_result_type();
+  return new Call_multiple_result_type(call);
 }
 
 // Class Struct_field.
Index: gcc/go/gofrontend/types.h
===================================================================
--- gcc/go/gofrontend/types.h	(revision 265293)
+++ gcc/go/gofrontend/types.h	(working copy)
@@ -511,7 +511,7 @@ class Type
   make_nil_type();
 
   static Type*
-  make_call_multiple_result_type();
+  make_call_multiple_result_type(Call_expression*);
 
   static Struct_type*
   make_struct_type(Struct_field_list* fields, Location);
Index: gcc/go/gofrontend/wb.cc
===================================================================
--- gcc/go/gofrontend/wb.cc	(revision 265293)
+++ gcc/go/gofrontend/wb.cc	(working copy)
@@ -189,8 +189,9 @@ Mark_address_taken::expression(Expressio
 class Check_escape : public Traverse
 {
  public:
-  Check_escape()
-    : Traverse(traverse_expressions | traverse_variables)
+  Check_escape(Gogo* gogo)
+    : Traverse(traverse_expressions | traverse_variables),
+      gogo_(gogo)
   { }
 
   int
@@ -198,6 +199,9 @@ class Check_escape : public Traverse
 
   int
   variable(Named_object*);
+
+ private:
+  Gogo* gogo_;
 };
 
 int
@@ -617,7 +621,7 @@ Gogo::add_write_barriers()
     {
       this->propagate_writebarrierrec();
 
-      Check_escape chk;
+      Check_escape chk(this);
       this->traverse(&chk);
     }
Martin Liška Oct. 22, 2018, noon UTC | #12
On 10/19/18 1:02 AM, Ian Lance Taylor wrote:
> On Sat, Sep 22, 2018 at 12:08 PM, marxin <mliska@suse.cz> wrote:
>>
>> gcc/go/ChangeLog:
>>
>> 2018-09-24  Martin Liska  <mliska@suse.cz>
>>
>>         * gofrontend/escape.cc (Gogo::analyze_escape): Remove
>>         usage of a parameter.
>>         (Gogo::assign_connectivity): Likewise.
>>         (class Escape_analysis_tag): Likewise.
>>         (Gogo::tag_function): Likewise.
>>         * gofrontend/expressions.cc (Call_expression::do_type): Likewise.
>>         * gofrontend/gogo.h (class Gogo): Likewise.
>>         * gofrontend/types.cc (class Call_multiple_result_type): Likewise.
>>         (Type::make_call_multiple_result_type): Likewise.
>>         * gofrontend/types.h (class Type): Likewise.
>>         * gofrontend/wb.cc (class Check_escape): Likewise.
>>         (Gogo::add_write_barriers): Likewise.
> 
> HI, unfortunately this is wrong.  As described in
> gcc/go/gofrontend/README, the files in that directory are mirrored
> from a separate repository (the same is true of the files in the libgo
> directory).  You should not make changes to them directly in the GCC
> repository.  I have reverted these changes, as follows.  Sorry.
> 
> Ian
> 

Hi Ian.

Got it. Is it possible that the removed chunks of code are somehow alive
in original repository in some conditional build?

Martin
Ian Lance Taylor Oct. 22, 2018, 3:36 p.m. UTC | #13
On Mon, Oct 22, 2018 at 5:00 AM, Martin Liška <mliska@suse.cz> wrote:
> On 10/19/18 1:02 AM, Ian Lance Taylor wrote:
>> On Sat, Sep 22, 2018 at 12:08 PM, marxin <mliska@suse.cz> wrote:
>>>
>>> gcc/go/ChangeLog:
>>>
>>> 2018-09-24  Martin Liska  <mliska@suse.cz>
>>>
>>>         * gofrontend/escape.cc (Gogo::analyze_escape): Remove
>>>         usage of a parameter.
>>>         (Gogo::assign_connectivity): Likewise.
>>>         (class Escape_analysis_tag): Likewise.
>>>         (Gogo::tag_function): Likewise.
>>>         * gofrontend/expressions.cc (Call_expression::do_type): Likewise.
>>>         * gofrontend/gogo.h (class Gogo): Likewise.
>>>         * gofrontend/types.cc (class Call_multiple_result_type): Likewise.
>>>         (Type::make_call_multiple_result_type): Likewise.
>>>         * gofrontend/types.h (class Type): Likewise.
>>>         * gofrontend/wb.cc (class Check_escape): Likewise.
>>>         (Gogo::add_write_barriers): Likewise.
>>
>> HI, unfortunately this is wrong.  As described in
>> gcc/go/gofrontend/README, the files in that directory are mirrored
>> from a separate repository (the same is true of the files in the libgo
>> directory).  You should not make changes to them directly in the GCC
>> repository.  I have reverted these changes, as follows.  Sorry.
>>
>> Ian
>>
>
> Hi Ian.
>
> Got it. Is it possible that the removed chunks of code are somehow alive
> in original repository in some conditional build?

No, I doubt it, but I'd also want to consider the changes separately.
There is benefit to consistency even if it leads to unused variables.

Ian
diff mbox series

Patch

diff --git a/gcc/alias.c b/gcc/alias.c
index 748da2b6951..7963ece291a 100644
--- a/gcc/alias.c
+++ b/gcc/alias.c
@@ -3270,15 +3270,6 @@  memory_modified_in_insn_p (const_rtx mem, const_rtx insn)
   return memory_modified;
 }
 
-/* Return TRUE if the destination of a set is rtx identical to
-   ITEM.  */
-static inline bool
-set_dest_equal_p (const_rtx set, const_rtx item)
-{
-  rtx dest = SET_DEST (set);
-  return rtx_equal_p (dest, item);
-}
-
 /* Initialize the aliasing machinery.  Initialize the REG_KNOWN_VALUE
    array.  */
 
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 0c86303b9fa..e50aa037c49 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -30224,21 +30224,6 @@  def_builtin_const2 (HOST_WIDE_INT mask, const char *name,
   return decl;
 }
 
-/* Like def_builtin, but also marks the function decl "pure".  */
-
-static inline tree
-def_builtin_pure2 (HOST_WIDE_INT mask, const char *name,
-		   enum ix86_builtin_func_type tcode, enum ix86_builtins code)
-{
-  tree decl = def_builtin2 (mask, name, tcode, code);
-  if (decl)
-    DECL_PURE_P (decl) = 1;
-  else
-    ix86_builtins_isa[(int) code].pure_p = true;
-
-  return decl;
-}
-
 /* Add any new builtin functions for a given ISA that may not have been
    declared.  This saves a bit of space compared to adding all of the
    declarations to the tree, even if we didn't use them.  */
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index c56bfe58a19..95d2845dd91 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -3291,21 +3291,6 @@  cp_binding_level_debug (cp_binding_level *scope, int line, const char *action)
     verbatim ("%s %s %p %d\n", action, desc, (void *) scope, line);
 }
 
-/* Return the estimated initial size of the hashtable of a NAMESPACE
-   scope.  */
-
-static inline size_t
-namespace_scope_ht_size (tree ns)
-{
-  tree name = DECL_NAME (ns);
-
-  return name == std_identifier
-    ? NAMESPACE_STD_HT_SIZE
-    : (name == global_identifier
-       ? GLOBAL_SCOPE_HT_SIZE
-       : NAMESPACE_ORDINARY_HT_SIZE);
-}
-
 /* A chain of binding_level structures awaiting reuse.  */
 
 static GTY((deletable)) cp_binding_level *free_binding_level;
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 6e68f2c41dc..6696f174d75 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -922,14 +922,6 @@  cp_lexer_nth_token_is_keyword (cp_lexer* lexer, size_t n, enum rid keyword)
   return cp_lexer_peek_nth_token (lexer, n)->keyword == keyword;
 }
 
-/* Return true if the next token is not the indicated KEYWORD.  */
-
-static inline bool
-cp_lexer_next_token_is_not_keyword (cp_lexer* lexer, enum rid keyword)
-{
-  return cp_lexer_peek_token (lexer)->keyword != keyword;
-}
-
 /* Return true if KEYWORD can start a decl-specifier.  */
 
 bool
diff --git a/gcc/diagnostic-show-locus.c b/gcc/diagnostic-show-locus.c
index 7dfb0a036cd..43a49ea8913 100644
--- a/gcc/diagnostic-show-locus.c
+++ b/gcc/diagnostic-show-locus.c
@@ -289,7 +289,6 @@  class layout
  private:
   diagnostic_context *m_context;
   pretty_printer *m_pp;
-  diagnostic_t m_diagnostic_kind;
   location_t m_primary_loc;
   expanded_location m_exploc;
   colorizer m_colorizer;
@@ -886,7 +885,6 @@  layout::layout (diagnostic_context * context,
 		diagnostic_t diagnostic_kind)
 : m_context (context),
   m_pp (context->printer),
-  m_diagnostic_kind (diagnostic_kind),
   m_primary_loc (richloc->get_range (0)->m_loc),
   m_exploc (richloc->get_expanded_location (0)),
   m_colorizer (context, diagnostic_kind),
diff --git a/gcc/dump-context.h b/gcc/dump-context.h
index 5ac9dd60e8d..5b20c15cb8b 100644
--- a/gcc/dump-context.h
+++ b/gcc/dump-context.h
@@ -147,7 +147,6 @@  class temp_dump_context
   pretty_printer m_pp;
   dump_context m_context;
   dump_context *m_saved;
-  bool m_saved_flag_remarks;
 };
 
 #endif /* CHECKING_P */
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 55fcb7be4af..66ee839b5cb 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -3649,7 +3649,6 @@  static void add_AT_specification (dw_die_ref, dw_die_ref);
 static inline dw_die_ref AT_ref (dw_attr_node *);
 static inline int AT_ref_external (dw_attr_node *);
 static inline void set_AT_ref_external (dw_attr_node *, int);
-static void add_AT_fde_ref (dw_die_ref, enum dwarf_attribute, unsigned);
 static void add_AT_loc (dw_die_ref, enum dwarf_attribute, dw_loc_descr_ref);
 static inline dw_loc_descr_ref AT_loc (dw_attr_node *);
 static void add_AT_loc_list (dw_die_ref, enum dwarf_attribute,
@@ -3665,16 +3664,11 @@  static void add_AT_symview (dw_die_ref, enum dwarf_attribute, const char *);
 static void add_AT_lbl_id (dw_die_ref, enum dwarf_attribute, const char *);
 static void add_AT_lineptr (dw_die_ref, enum dwarf_attribute, const char *);
 static void add_AT_macptr (dw_die_ref, enum dwarf_attribute, const char *);
-static void add_AT_loclistsptr (dw_die_ref, enum dwarf_attribute,
-				const char *);
-static void add_AT_offset (dw_die_ref, enum dwarf_attribute,
-			   unsigned HOST_WIDE_INT);
 static void add_AT_range_list (dw_die_ref, enum dwarf_attribute,
                                unsigned long, bool);
 static inline const char *AT_lbl (dw_attr_node *);
 static dw_attr_node *get_AT (dw_die_ref, enum dwarf_attribute);
 static const char *get_AT_low_pc (dw_die_ref);
-static const char *get_AT_hi_pc (dw_die_ref);
 static const char *get_AT_string (dw_die_ref, enum dwarf_attribute);
 static int get_AT_flag (dw_die_ref, enum dwarf_attribute);
 static unsigned get_AT_unsigned (dw_die_ref, enum dwarf_attribute);
@@ -3716,7 +3710,6 @@  static int same_dw_val_p (const dw_val_node *, const dw_val_node *, int *);
 static int same_attr_p (dw_attr_node *, dw_attr_node *, int *);
 static int same_die_p (dw_die_ref, dw_die_ref, int *);
 static int is_type_die (dw_die_ref);
-static int is_comdat_die (dw_die_ref);
 static inline bool is_template_instantiation (dw_die_ref);
 static int is_declaration_die (dw_die_ref);
 static int should_move_die_to_comdat (dw_die_ref);
@@ -3773,7 +3766,6 @@  static int decl_quals (const_tree);
 static dw_die_ref modified_type_die (tree, int, bool, dw_die_ref);
 static dw_die_ref generic_parameter_die (tree, tree, bool, dw_die_ref);
 static dw_die_ref template_parameter_pack_die (tree, tree, dw_die_ref);
-static int type_is_enum (const_tree);
 static unsigned int dbx_reg_number (const_rtx);
 static void add_loc_descr_op_piece (dw_loc_descr_ref *, int);
 static dw_loc_descr_ref reg_loc_descriptor (rtx, enum var_init_status);
@@ -3796,7 +3788,6 @@  static dw_loc_list_ref loc_list_from_tree (tree, int,
 					   struct loc_descr_context *);
 static dw_loc_descr_ref loc_descriptor_from_tree (tree, int,
 						  struct loc_descr_context *);
-static HOST_WIDE_INT ceiling (HOST_WIDE_INT, unsigned int);
 static tree field_type (const_tree);
 static unsigned int simple_type_align_in_bits (const_tree);
 static unsigned int simple_decl_align_in_bits (const_tree);
@@ -3910,8 +3901,6 @@  static void prune_unused_types (void);
 static int maybe_emit_file (struct dwarf_file_data *fd);
 static inline const char *AT_vms_delta1 (dw_attr_node *);
 static inline const char *AT_vms_delta2 (dw_attr_node *);
-static inline void add_AT_vms_delta (dw_die_ref, enum dwarf_attribute,
-				     const char *, const char *);
 static void append_entry_to_tmpl_value_parm_die_table (dw_die_ref, tree);
 static void gen_remaining_tmpl_value_param_die_attribute (void);
 static bool generic_type_p (tree);
@@ -4836,20 +4825,6 @@  set_AT_ref_external (dw_attr_node *a, int i)
   a->dw_attr_val.v.val_die_ref.external = i;
 }
 
-/* Add an FDE reference attribute value to a DIE.  */
-
-static inline void
-add_AT_fde_ref (dw_die_ref die, enum dwarf_attribute attr_kind, unsigned int targ_fde)
-{
-  dw_attr_node attr;
-
-  attr.dw_attr = attr_kind;
-  attr.dw_attr_val.val_class = dw_val_class_fde_ref;
-  attr.dw_attr_val.val_entry = NULL;
-  attr.dw_attr_val.v.val_fde_index = targ_fde;
-  add_dwarf_attr (die, &attr);
-}
-
 /* Add a location description attribute value to a DIE.  */
 
 static inline void
@@ -5160,22 +5135,6 @@  AT_file (dw_attr_node *a)
   return a->dw_attr_val.v.val_file;
 }
 
-/* Add a vms delta attribute value to a DIE.  */
-
-static inline void
-add_AT_vms_delta (dw_die_ref die, enum dwarf_attribute attr_kind,
-		  const char *lbl1, const char *lbl2)
-{
-  dw_attr_node attr;
-
-  attr.dw_attr = attr_kind;
-  attr.dw_attr_val.val_class = dw_val_class_vms_delta;
-  attr.dw_attr_val.val_entry = NULL;
-  attr.dw_attr_val.v.val_vms_delta.lbl1 = xstrdup (lbl1);
-  attr.dw_attr_val.v.val_vms_delta.lbl2 = xstrdup (lbl2);
-  add_dwarf_attr (die, &attr);
-}
-
 /* Add a symbolic view identifier attribute value to a DIE.  */
 
 static inline void
@@ -5226,22 +5185,6 @@  add_AT_lineptr (dw_die_ref die, enum dwarf_attribute attr_kind,
   add_dwarf_attr (die, &attr);
 }
 
-/* Add a section offset attribute value to a DIE, an offset into the
-   debug_loclists section.  */
-
-static inline void
-add_AT_loclistsptr (dw_die_ref die, enum dwarf_attribute attr_kind,
-		    const char *label)
-{
-  dw_attr_node attr;
-
-  attr.dw_attr = attr_kind;
-  attr.dw_attr_val.val_class = dw_val_class_loclistsptr;
-  attr.dw_attr_val.val_entry = NULL;
-  attr.dw_attr_val.v.val_lbl_id = xstrdup (label);
-  add_dwarf_attr (die, &attr);
-}
-
 /* Add a section offset attribute value to a DIE, an offset into the
    debug_macinfo section.  */
 
@@ -5258,21 +5201,6 @@  add_AT_macptr (dw_die_ref die, enum dwarf_attribute attr_kind,
   add_dwarf_attr (die, &attr);
 }
 
-/* Add an offset attribute value to a DIE.  */
-
-static inline void
-add_AT_offset (dw_die_ref die, enum dwarf_attribute attr_kind,
-	       unsigned HOST_WIDE_INT offset)
-{
-  dw_attr_node attr;
-
-  attr.dw_attr = attr_kind;
-  attr.dw_attr_val.val_class = dw_val_class_offset;
-  attr.dw_attr_val.val_entry = NULL;
-  attr.dw_attr_val.v.val_offset = offset;
-  add_dwarf_attr (die, &attr);
-}
-
 /* Add a range_list attribute value to a DIE.  When using
    dwarf_split_debug_info, address attributes in dies destined for the
    final executable should be direct references--setting the parameter
@@ -5383,18 +5311,6 @@  get_AT_low_pc (dw_die_ref die)
   return a ? AT_lbl (a) : NULL;
 }
 
-/* Return the "high pc" attribute value, typically associated with a subprogram
-   DIE.  Return null if the "high pc" attribute is either not present, or if it
-   cannot be represented as an assembler label identifier.  */
-
-static inline const char *
-get_AT_hi_pc (dw_die_ref die)
-{
-  dw_attr_node *a = get_AT (die, DW_AT_high_pc);
-
-  return a ? AT_lbl (a) : NULL;
-}
-
 /* Return the value of the string attribute designated by ATTR_KIND, or
    NULL if it is not present.  */
 
@@ -7907,36 +7823,6 @@  is_type_die (dw_die_ref die)
     }
 }
 
-/* Returns 1 iff C is the sort of DIE that should go into a COMDAT CU.
-   Basically, we want to choose the bits that are likely to be shared between
-   compilations (types) and leave out the bits that are specific to individual
-   compilations (functions).  */
-
-static int
-is_comdat_die (dw_die_ref c)
-{
-  /* I think we want to leave base types and __vtbl_ptr_type in the main CU, as
-     we do for stabs.  The advantage is a greater likelihood of sharing between
-     objects that don't include headers in the same order (and therefore would
-     put the base types in a different comdat).  jason 8/28/00 */
-
-  if (c->die_tag == DW_TAG_base_type)
-    return 0;
-
-  if (c->die_tag == DW_TAG_pointer_type
-      || c->die_tag == DW_TAG_reference_type
-      || c->die_tag == DW_TAG_rvalue_reference_type
-      || c->die_tag == DW_TAG_const_type
-      || c->die_tag == DW_TAG_volatile_type)
-    {
-      dw_die_ref t = get_AT_ref (c, DW_AT_type);
-
-      return t ? is_comdat_die (t) : 0;
-    }
-
-  return is_type_die (c);
-}
-
 /* Returns true iff C is a compile-unit DIE.  */
 
 static inline bool
@@ -7965,15 +7851,6 @@  is_namespace_die (dw_die_ref c)
   return c && c->die_tag == DW_TAG_namespace;
 }
 
-/* Returns true iff C is a class or structure DIE.  */
-
-static inline bool
-is_class_die (dw_die_ref c)
-{
-  return c && (c->die_tag == DW_TAG_class_type
-               || c->die_tag == DW_TAG_structure_type);
-}
-
 /* Return non-zero if this DIE is a template parameter.  */
 
 static inline bool
@@ -13703,15 +13580,6 @@  template_parameter_pack_die (tree parm_pack,
   return die;
 }
 
-/* Given a pointer to an arbitrary ..._TYPE tree node, return true if it is
-   an enumerated type.  */
-
-static inline int
-type_is_enum (const_tree type)
-{
-  return TREE_CODE (type) == ENUMERAL_TYPE;
-}
-
 /* Return the DBX register number described by a given RTL node.  */
 
 static unsigned int
@@ -18933,15 +18801,6 @@  loc_descriptor_from_tree (tree loc, int want_address,
   return ret->expr;
 }
 
-/* Given a value, round it up to the lowest multiple of `boundary'
-   which is not less than the value itself.  */
-
-static inline HOST_WIDE_INT
-ceiling (HOST_WIDE_INT value, unsigned int boundary)
-{
-  return (((value + boundary - 1) / boundary) * boundary);
-}
-
 /* Given a pointer to what is assumed to be a FIELD_DECL node, return a
    pointer to the declared type for the relevant field variable, or return
    `integer_type_node' if the given node turns out to be an
diff --git a/gcc/edit-context.c b/gcc/edit-context.c
index 3cdb88d565c..85afc4a2ec7 100644
--- a/gcc/edit-context.c
+++ b/gcc/edit-context.c
@@ -182,7 +182,7 @@  class line_event
 {
  public:
   line_event (int start, int next, int len) : m_start (start),
-    m_next (next), m_delta (len - (next - start)) {}
+    m_delta (len - (next - start)) {}
 
   int get_effective_column (int orig_column) const
   {
@@ -194,7 +194,6 @@  class line_event
 
  private:
   int m_start;
-  int m_next;
   int m_delta;
 };
 
diff --git a/gcc/fortran/trans.c b/gcc/fortran/trans.c
index 153bab63396..03dc7a284b5 100644
--- a/gcc/fortran/trans.c
+++ b/gcc/fortran/trans.c
@@ -61,26 +61,6 @@  gfc_advance_chain (tree t, int n)
   return t;
 }
 
-
-/* Strip off a legitimate source ending from the input
-   string NAME of length LEN.  */
-
-static inline void
-remove_suffix (char *name, int len)
-{
-  int i;
-
-  for (i = 2; i < 8 && len > i; i++)
-    {
-      if (name[len - i] == '.')
-	{
-	  name[len - i] = '\0';
-	  break;
-	}
-    }
-}
-
-
 /* Creates a variable declaration with a given TYPE.  */
 
 tree
diff --git a/gcc/go/gofrontend/escape.cc b/gcc/go/gofrontend/escape.cc
index 9c31525eb95..d9dcc8993f4 100644
--- a/gcc/go/gofrontend/escape.cc
+++ b/gcc/go/gofrontend/escape.cc
@@ -979,7 +979,7 @@  Gogo::analyze_escape()
       for (std::vector<Named_object*>::iterator fn = stack.begin();
            fn != stack.end();
            ++fn)
-        this->tag_function(context, *fn);
+	this->tag_function(*fn);
 
       if (this->debug_escape_level() != 0)
 	{
@@ -1232,10 +1232,10 @@  Escape_analysis_loop::statement(Block*, size_t*, Statement* s)
 class Escape_analysis_assign : public Traverse
 {
 public:
-  Escape_analysis_assign(Escape_context* context, Named_object* fn)
+  Escape_analysis_assign(Escape_context* context)
     : Traverse(traverse_statements
 	       | traverse_expressions),
-      context_(context), fn_(fn)
+      context_(context)
   { }
 
   // Model statements within a function as assignments and flows between nodes.
@@ -1272,8 +1272,6 @@  public:
 private:
   // The escape context for this set of functions.
   Escape_context* context_;
-  // The current function being analyzed.
-  Named_object* fn_;
 };
 
 // Helper function to detect self assignment like the following.
@@ -2703,7 +2701,7 @@  Gogo::assign_connectivity(Escape_context* context, Named_object* fn)
   int save_depth = context->loop_depth();
   context->set_loop_depth(1);
 
-  Escape_analysis_assign ea(context, fn);
+  Escape_analysis_assign ea(context);
   Function::Results* res = fn->func_value()->result_variables();
   if (res != NULL)
     {
@@ -3266,17 +3264,13 @@  Gogo::propagate_escape(Escape_context* context, Node* dst)
 class Escape_analysis_tag
 {
  public:
-  Escape_analysis_tag(Escape_context* context)
-    : context_(context)
+  Escape_analysis_tag()
   { }
 
   // Add notes to the function's type about the escape information of its
   // input parameters.
   void
   tag(Named_object* fn);
-
- private:
-  Escape_context* context_;
 };
 
 void
@@ -3384,9 +3378,9 @@  Escape_analysis_tag::tag(Named_object* fn)
 // retain analysis results across imports.
 
 void
-Gogo::tag_function(Escape_context* context, Named_object* fn)
+Gogo::tag_function(Named_object* fn)
 {
-  Escape_analysis_tag eat(context);
+  Escape_analysis_tag eat;
   eat.tag(fn);
 }
 
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc
index 46a1e693d50..91cc30e30b5 100644
--- a/gcc/go/gofrontend/expressions.cc
+++ b/gcc/go/gofrontend/expressions.cc
@@ -10089,7 +10089,7 @@  Call_expression::do_type()
   else if (results->size() == 1)
     ret = results->begin()->type();
   else
-    ret = Type::make_call_multiple_result_type(this);
+    ret = Type::make_call_multiple_result_type();
 
   this->type_ = ret;
 
diff --git a/gcc/go/gofrontend/gogo.h b/gcc/go/gofrontend/gogo.h
index 0864ee1d72a..07d08c2dc60 100644
--- a/gcc/go/gofrontend/gogo.h
+++ b/gcc/go/gofrontend/gogo.h
@@ -680,7 +680,7 @@  class Gogo
   // Add notes about the escape level of a function's input and output
   // parameters for exporting and importing top level functions. 
   void
-  tag_function(Escape_context*, Named_object*);
+  tag_function(Named_object*);
 
   // Reclaim memory of escape analysis Nodes.
   void
diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc
index cc07bfc25bd..ad0704cc2da 100644
--- a/gcc/go/gofrontend/types.cc
+++ b/gcc/go/gofrontend/types.cc
@@ -5466,9 +5466,8 @@  Type::make_nil_type()
 class Call_multiple_result_type : public Type
 {
  public:
-  Call_multiple_result_type(Call_expression* call)
-    : Type(TYPE_CALL_MULTIPLE_RESULT),
-      call_(call)
+  Call_multiple_result_type()
+    : Type(TYPE_CALL_MULTIPLE_RESULT)
   { }
 
  protected:
@@ -5501,18 +5500,14 @@  class Call_multiple_result_type : public Type
   void
   do_mangled_name(Gogo*, std::string*) const
   { go_assert(saw_errors()); }
-
- private:
-  // The expression being called.
-  Call_expression* call_;
 };
 
 // Make a call result type.
 
 Type*
-Type::make_call_multiple_result_type(Call_expression* call)
+Type::make_call_multiple_result_type()
 {
-  return new Call_multiple_result_type(call);
+  return new Call_multiple_result_type();
 }
 
 // Class Struct_field.
diff --git a/gcc/go/gofrontend/types.h b/gcc/go/gofrontend/types.h
index e011236cba5..85e7c51c302 100644
--- a/gcc/go/gofrontend/types.h
+++ b/gcc/go/gofrontend/types.h
@@ -511,7 +511,7 @@  class Type
   make_nil_type();
 
   static Type*
-  make_call_multiple_result_type(Call_expression*);
+  make_call_multiple_result_type();
 
   static Struct_type*
   make_struct_type(Struct_field_list* fields, Location);
diff --git a/gcc/go/gofrontend/wb.cc b/gcc/go/gofrontend/wb.cc
index 4f84d9950f1..52db71046fe 100644
--- a/gcc/go/gofrontend/wb.cc
+++ b/gcc/go/gofrontend/wb.cc
@@ -189,9 +189,8 @@  Mark_address_taken::expression(Expression** pexpr)
 class Check_escape : public Traverse
 {
  public:
-  Check_escape(Gogo* gogo)
-    : Traverse(traverse_expressions | traverse_variables),
-      gogo_(gogo)
+  Check_escape()
+    : Traverse(traverse_expressions | traverse_variables)
   { }
 
   int
@@ -199,9 +198,6 @@  class Check_escape : public Traverse
 
   int
   variable(Named_object*);
-
- private:
-  Gogo* gogo_;
 };
 
 int
@@ -621,7 +617,7 @@  Gogo::add_write_barriers()
     {
       this->propagate_writebarrierrec();
 
-      Check_escape chk(this);
+      Check_escape chk;
       this->traverse(&chk);
     }
 
diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c
index 4dcc013f6bb..69898d4ffd8 100644
--- a/gcc/graphite-sese-to-poly.c
+++ b/gcc/graphite-sese-to-poly.c
@@ -58,14 +58,6 @@  along with GCC; see the file COPYING3.  If not see
 
 #include "graphite.h"
 
-/* Assigns to RES the value of the INTEGER_CST T.  */
-
-static inline void
-tree_int_to_gmp (tree t, mpz_t res)
-{
-  wi::to_mpz (wi::to_wide (t), res, TYPE_SIGN (TREE_TYPE (t)));
-}
-
 /* Return an isl identifier for the polyhedral basic block PBB.  */
 
 static isl_id *
diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c
index afc45969558..27ae8e0fe27 100644
--- a/gcc/ipa-cp.c
+++ b/gcc/ipa-cp.c
@@ -405,16 +405,6 @@  ipa_get_poly_ctx_lat (struct ipa_node_params *info, int i)
   return &plats->ctxlat;
 }
 
-/* Return the lattice corresponding to the value range of the Ith formal
-   parameter of the function described by INFO.  */
-
-static inline ipcp_vr_lattice *
-ipa_get_vr_lat (struct ipa_node_params *info, int i)
-{
-  struct ipcp_param_lattices *plats = ipa_get_parm_lattices (info, i);
-  return &plats->m_value_range;
-}
-
 /* Return whether LAT is a lattice with a single constant and without an
    undefined value.  */
 
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index 8be4d46c8ad..774d1ff3aaa 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -630,33 +630,6 @@  get_reload_reg (enum op_type type, machine_mode mode, rtx original,
 }
 
 
-
-/* The page contains code to extract memory address parts.  */
-
-/* Wrapper around REGNO_OK_FOR_INDEX_P, to allow pseudos.  */
-static inline bool
-ok_for_index_p_nonstrict (rtx reg)
-{
-  unsigned regno = REGNO (reg);
-
-  return regno >= FIRST_PSEUDO_REGISTER || REGNO_OK_FOR_INDEX_P (regno);
-}
-
-/* A version of regno_ok_for_base_p for use here, when all pseudos
-   should count as OK.	Arguments as for regno_ok_for_base_p.  */
-static inline bool
-ok_for_base_p_nonstrict (rtx reg, machine_mode mode, addr_space_t as,
-			 enum rtx_code outer_code, enum rtx_code index_code)
-{
-  unsigned regno = REGNO (reg);
-
-  if (regno >= FIRST_PSEUDO_REGISTER)
-    return true;
-  return ok_for_base_p_1 (regno, mode, as, outer_code, index_code);
-}
-
-
-
 /* The page contains major code to choose the current insn alternative
    and generate reloads for it.	 */
 
diff --git a/gcc/tree-chrec.c b/gcc/tree-chrec.c
index fa8c2ee2a20..2717b40485b 100644
--- a/gcc/tree-chrec.c
+++ b/gcc/tree-chrec.c
@@ -41,53 +41,6 @@  along with GCC; see the file COPYING3.  If not see
 
 /* Extended folder for chrecs.  */
 
-/* Determines whether CST is not a constant evolution.  */
-
-static inline bool
-is_not_constant_evolution (const_tree cst)
-{
-  return (TREE_CODE (cst) == POLYNOMIAL_CHREC);
-}
-
-/* Fold CODE for a polynomial function and a constant.  */
-
-static inline tree
-chrec_fold_poly_cst (enum tree_code code,
-		     tree type,
-		     tree poly,
-		     tree cst)
-{
-  gcc_assert (poly);
-  gcc_assert (cst);
-  gcc_assert (TREE_CODE (poly) == POLYNOMIAL_CHREC);
-  gcc_checking_assert (!is_not_constant_evolution (cst));
-  gcc_checking_assert (useless_type_conversion_p (type, chrec_type (poly)));
-
-  switch (code)
-    {
-    case PLUS_EXPR:
-      return build_polynomial_chrec
-	(CHREC_VARIABLE (poly),
-	 chrec_fold_plus (type, CHREC_LEFT (poly), cst),
-	 CHREC_RIGHT (poly));
-
-    case MINUS_EXPR:
-      return build_polynomial_chrec
-	(CHREC_VARIABLE (poly),
-	 chrec_fold_minus (type, CHREC_LEFT (poly), cst),
-	 CHREC_RIGHT (poly));
-
-    case MULT_EXPR:
-      return build_polynomial_chrec
-	(CHREC_VARIABLE (poly),
-	 chrec_fold_multiply (type, CHREC_LEFT (poly), cst),
-	 chrec_fold_multiply (type, CHREC_RIGHT (poly), cst));
-
-    default:
-      return chrec_dont_know;
-    }
-}
-
 /* Fold the addition of two polynomial functions.  */
 
 static inline tree
diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c
index 77eefac4e34..52aa5756c94 100644
--- a/gcc/tree-if-conv.c
+++ b/gcc/tree-if-conv.c
@@ -1114,19 +1114,6 @@  all_preds_critical_p (basic_block bb)
   return true;
 }
 
-/* Returns true if at least one successor in on critical edge.  */
-static inline bool
-has_pred_critical_p (basic_block bb)
-{
-  edge e;
-  edge_iterator ei;
-
-  FOR_EACH_EDGE (e, ei, bb->preds)
-    if (EDGE_COUNT (e->src->succs) > 1)
-      return true;
-  return false;
-}
-
 /* Return true when BB is if-convertible.  This routine does not check
    basic block's statements and phis.
 
diff --git a/gcc/tree-ssa-coalesce.c b/gcc/tree-ssa-coalesce.c
index c123449bdda..a17c7749482 100644
--- a/gcc/tree-ssa-coalesce.c
+++ b/gcc/tree-ssa-coalesce.c
@@ -988,22 +988,6 @@  build_ssa_conflict_graph (tree_live_info_p liveinfo)
   return graph;
 }
 
-
-/* Shortcut routine to print messages to file F of the form:
-   "STR1 EXPR1 STR2 EXPR2 STR3."  */
-
-static inline void
-print_exprs (FILE *f, const char *str1, tree expr1, const char *str2,
-	     tree expr2, const char *str3)
-{
-  fprintf (f, "%s", str1);
-  print_generic_expr (f, expr1, TDF_SLIM);
-  fprintf (f, "%s", str2);
-  print_generic_expr (f, expr2, TDF_SLIM);
-  fprintf (f, "%s", str3);
-}
-
-
 /* Print a failure to coalesce a MUST_COALESCE pair X and Y.  */
 
 static inline void
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index 267086cdf48..d1b0cc0c26f 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -825,12 +825,6 @@  bitmap_set_contains_value (bitmap_set_t set, unsigned int value_id)
   return bitmap_bit_p (&set->values, value_id);
 }
 
-static inline bool
-bitmap_set_contains_expr (bitmap_set_t set, const pre_expr expr)
-{
-  return bitmap_bit_p (&set->expressions, get_expression_id (expr));
-}
-
 /* Return true if two bitmap sets are equal.  */
 
 static bool
diff --git a/gcc/tree-ssa-uninit.c b/gcc/tree-ssa-uninit.c
index f3e42ddbd7f..d2c50344f71 100644
--- a/gcc/tree-ssa-uninit.c
+++ b/gcc/tree-ssa-uninit.c
@@ -1586,16 +1586,6 @@  is_superset_of (pred_chain_union preds1, pred_chain_union preds2)
   return true;
 }
 
-/* Returns true if TC is AND or OR.  */
-
-static inline bool
-is_and_or_or_p (enum tree_code tc, tree type)
-{
-  return (tc == BIT_IOR_EXPR
-	  || (tc == BIT_AND_EXPR
-	      && (type == 0 || TREE_CODE (type) == BOOLEAN_TYPE)));
-}
-
 /* Returns true if X1 is the negate of X2.  */
 
 static inline bool
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 622ccbc2df7..3731f6c7b3e 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -848,27 +848,6 @@  value_inside_range (tree val, tree min, tree max)
 }
 
 
-/* Return true if value ranges VR0 and VR1 have a non-empty
-   intersection.
-
-   Benchmark compile/20001226-1.c compilation time after changing this
-   function.
-   */
-
-static inline bool
-value_ranges_intersect_p (const value_range *vr0, const value_range *vr1)
-{
-  /* The value ranges do not intersect if the maximum of the first range is
-     less than the minimum of the second range or vice versa.
-     When those relations are unknown, we can't do any better.  */
-  if (operand_less_p (vr0->max, vr1->min) != 0)
-    return false;
-  if (operand_less_p (vr1->max, vr0->min) != 0)
-    return false;
-  return true;
-}
-
-
 /* Return TRUE if *VR includes the value zero.  */
 
 bool
@@ -890,23 +869,6 @@  range_includes_zero_p (const value_range *vr)
   return value_inside_range (zero, vr->min, vr->max) != 0;
 }
 
-/* Return true if *VR is know to only contain nonnegative values.  */
-
-static inline bool
-value_range_nonnegative_p (const value_range *vr)
-{
-  /* Testing for VR_ANTI_RANGE is not useful here as any anti-range
-     which would return a useful value should be encoded as a 
-     VR_RANGE.  */
-  if (vr->type == VR_RANGE)
-    {
-      int result = compare_values (vr->min, integer_zero_node);
-      return (result == 0 || result == 1);
-    }
-
-  return false;
-}
-
 /* If *VR has a value rante that is a single constant value return that,
    otherwise return NULL_TREE.  */