This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: [GSOC] LTO dump tool project
- From: Martin Liška <mliska at suse dot cz>
- To: Hrishikesh Kulkarni <hrishikeshparag at gmail dot com>, GCC Development <gcc at gcc dot gnu dot org>
- Cc: Jan Hubicka <jh at suse dot cz>, Richard Biener <richard dot guenther at gmail dot com>, Martin Jambor <mjambor at suse dot cz>
- Date: Fri, 8 Jun 2018 15:40:59 +0200
- Subject: Re: [GSOC] LTO dump tool project
- References: <CAL+0whRqd8c9ZTs9Q0OektMBYr6MhEDoKw+dtKt_JC8m3xjtBg@mail.gmail.com> <0b7f9c71-3b4c-6720-ae02-35bb7c8caeb7@suse.cz> <621f6e76-8a34-575a-9b43-dbf9e22804c7@suse.cz> <CAL+0whRUQEppBJCrj6r33Xg83rgOvhQq=xX4x-Vr8KJRY=xLjQ@mail.gmail.com> <af0b5d5d-3dee-7777-924d-f9ee932e9ba6@suse.cz> <CAL+0whTynz0QDDHn3edQJRsNZDMfY=f5mO9zH7hvs3Wc7WRDJw@mail.gmail.com> <693cbf87-db26-9a76-67ba-3d2a4cfb3803@suse.cz> <CAL+0whTHh_8bzvatFBxwNN8Rg=8_yrGEkfJn9fnrzJjQY1MSFw@mail.gmail.com>
On 06/08/2018 03:27 PM, Hrishikesh Kulkarni wrote:
> Hi,
>
> Linking is not taking place as the debug_function() being used is in
> tree-cfg.c. How should I go about on adding in make-file considering
> the dependencies?
Hi.
There's wrong declaration of the function in header file. I'll fix it soon
on trunk. Please carry on with following patch:
diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c
index 17634797c6e..363b59febd6 100644
--- a/gcc/lto/lto.c
+++ b/gcc/lto/lto.c
@@ -55,6 +55,7 @@ along with GCC; see the file COPYING3. If not see
#include "fold-const.h"
#include "attribs.h"
#include "builtins.h"
+#include "tree-cfg.h"
/* Number of parallel tasks to run, -1 if we want to use GNU Make jobserver. */
@@ -3338,6 +3339,8 @@ offload_handle_link_vars (void)
void
lto_main (void)
{
+ // only test if it builds
+ debug_function (cfun->decl, TDF_NONE);
/* LTO is called as a front end, even though it is not a front end.
Because it is called as a front end, TV_PHASE_PARSING and
TV_PARSE_GLOBAL are active, and we need to turn them off while
diff --git a/gcc/tree-cfg.h b/gcc/tree-cfg.h
index 73237a604be..9491bb45feb 100644
--- a/gcc/tree-cfg.h
+++ b/gcc/tree-cfg.h
@@ -81,7 +81,7 @@ extern void fold_loop_internal_call (gimple *, tree);
extern basic_block move_sese_region_to_fn (struct function *, basic_block,
basic_block, tree);
extern void dump_function_to_file (tree, FILE *, dump_flags_t);
-extern void debug_function (tree, int) ;
+extern void debug_function (tree, dump_flags_t);
extern void print_loops_bb (FILE *, basic_block, int, int);
extern void print_loops (FILE *, int);
extern void debug (struct loop &ref);
Martin
>
> Please find the diff file attached herewith.
>
> Regards,
> Hrishikesh
>
> On Tue, Jun 5, 2018 at 12:38 AM, Martin Liška <mliska@suse.cz> wrote:
>> On 06/04/2018 08:13 PM, Hrishikesh Kulkarni wrote:
>>>
>>> Hi,
>>>
>>> -fdump-lto-list will dump all the symbol list
>>
>>
>> I see extra new lines in the output:
>>
>> $ lto1 -fdump-lto-list main.o
>> [..snip..]
>> Symbol Table
>> Name Type Visibility
>>
>> fwrite/15 function default
>>
>> foo/14 function default
>>
>> mystring/12 variable default
>>
>> pole/11 variable default
>>
>> main/13 function default
>>
>>> -fdump-lto-list -demangle will dump all the list with symbol names
>>> demangled
>>
>>
>> Good for now. Note that non-demagle version prints function names with order
>> (/$number).
>> I would not print that.
>>
>>> -fdump-lto-symbol=foo will dump details of foo
>>
>>
>> I would really prefer to use symtab_node::debug for now. It presents all
>> details about
>> symbol instead of current implementation which does: '-fdump-lto-list | grep
>> foo'
>>
>>>
>>> The output(demangled) will be in tabular form like nm:
>>> Symbol Table
>>> Name Type Visibility
>>> printf function default
>>> k variable default
>>> main function default
>>> bar function default
>>> foo function default
>>>
>>> I have tried to format the changes according to gnu coding style and
>>> added required methods in symtab_node.
>>
>>
>> That's nice that you came up with new symbol_node methods. It's much better.
>> About the GNU coding style, I still see trailing whitespace:
>>
>> === ERROR type #3: there should be no space before a left square bracket (1
>> error(s)) ===
>> gcc/symtab.c:818:26: return visibility_types [DECL_VISIBILITY (decl)];
>>
>> === ERROR type #4: trailing whitespace (6 error(s)) ===
>> gcc/lto/lto-dump.c:40:4:void█
>> gcc/lto/lto-dump.c:45:0:█
>> gcc/lto/lto-dump.c:56:52: fprintf (stderr,
>> "\n%20s",(flag_lto_dump_demangle)█
>> gcc/lto/lto-dump.c:73:53: fprintf (stderr,
>> "\n%20s",(flag_lto_dump_demangle)█
>> gcc/lto/lto-dump.c:78:2: }█
>> gcc/lto/lto-dump.c:79:1:}█
>>
>> Martin
>>
>>
>>>
>>> Please find the diff file attached.
>>>
>>> Regards,
>>> Hrishikesh
>>>
>>> On Mon, Jun 4, 2018 at 2:06 PM, Martin Liška <mliska@suse.cz> wrote:
>>>>
>>>> On 06/01/2018 08:59 PM, Hrishikesh Kulkarni wrote:
>>>>>
>>>>> Hi,
>>>>> I have pushed the changes to github
>>>>> (https://github.com/hrisearch/gcc). Added a command line option for
>>>>> specific dumps of variables and functions used in IL e.g.
>>>>> -fdump-lto-list=foo will dump:
>>>>> Call Graph:
>>>>>
>>>>> foo/1 (foo)
>>>>> Type: function
>>>>> visibility: default
>>>>
>>>>
>>>> Hi.
>>>>
>>>> Thanks for the next step. I've got some comments about it:
>>>>
>>>> - -fdump-lto-list=foo is wrong option name, I would use -fdump-lto-symbol
>>>> or something similar.
>>>>
>>>> - for -fdump-lto-list I would really prefer to use a format similar to
>>>> nm:
>>>> print a header with column description and then one line for a symbol
>>>>
>>>> - think about mangling/demangling of C++ symbols, you can take a look at
>>>> nm it also has --demangle, --no-demangle
>>>>
>>>> - please learn & try to use an autoformat for your editor in order to
>>>> fulfill GNU coding style. Following checker will help you:
>>>>
>>>> $ ./contrib/check_GNU_style.py /tmp/p
>>>> === ERROR type #1: dot, space, space, end of comment (6 error(s)) ===
>>>> gcc/lto/lto-dump.c:38:17:/*Dump everything*/
>>>> gcc/lto/lto-dump.c:44:41:/*Dump variables and functions used in IL*/
>>>> gcc/lto/lto-dump.c:73:50:/*Dump specific variables and functions used in
>>>> IL*/
>>>> gcc/lto/lto.c:3364:19: /*Dump everything*/
>>>> gcc/lto/lto.c:3368:43: /*Dump variables and functions used in IL*/
>>>> gcc/lto/lto.c:3372:52: /*Dump specific variables and functions used in
>>>> IL*/
>>>>
>>>> === ERROR type #2: lines should not exceed 80 characters (11 error(s))
>>>> ===
>>>> gcc/lto/lto-dump.c:51:80: static const char * const
>>>> symtab_type_names[] = {"symbol", "function", "variable"};
>>>> gcc/lto/lto-dump.c:56:80: fprintf (stderr, "\n%s (%s)",
>>>> cnode->dump_asm_name (), cnode->name ());
>>>> gcc/lto/lto-dump.c:57:80: fprintf (stderr, "\n Type: %s",
>>>> symtab_type_names[cnode->type]);
>>>> gcc/lto/lto-dump.c:66:80: fprintf (stderr, "\n%s (%s)",
>>>> vnode->dump_asm_name (), vnode->name ());
>>>> gcc/lto/lto-dump.c:67:80: fprintf (stderr, "\n Type: %s",
>>>> symtab_type_names[vnode->type]);
>>>> gcc/lto/lto-dump.c:80:80: static const char * const
>>>> symtab_type_names[] = {"symbol", "function", "variable"};
>>>> gcc/lto/lto-dump.c:87:80: fprintf (stderr, "\n%s
>>>> (%s)", cnode->dump_asm_name (), cnode->name ());
>>>> gcc/lto/lto-dump.c:88:80: fprintf (stderr, "\n
>>>> Type: %s", symtab_type_names[cnode->type]);
>>>> gcc/lto/lto-dump.c:99:80: fprintf (stderr, "\n%s
>>>> (%s)", vnode->dump_asm_name (), vnode->name ());
>>>> gcc/lto/lto-dump.c:100:80: fprintf (stderr, "\n
>>>> Type: %s", symtab_type_names[vnode->type]);
>>>> gcc/lto/Make-lang.in:25:80:LTO_OBJS = lto/lto-lang.o lto/lto.o
>>>> lto/lto-object.o attribs.o lto/lto-partition.o lto/lto-symtab.o
>>>> lto/lto-dump.o
>>>>
>>>> === ERROR type #3: there should be exactly one space between function
>>>> name and parenthesis (15 error(s)) ===
>>>> gcc/lto/lto-dump.c:39:9:void dump()
>>>> gcc/lto/lto-dump.c:41:8: fprintf(stderr, "\nHello World!\n");
>>>> gcc/lto/lto-dump.c:45:14:void dump_list()
>>>> gcc/lto/lto-dump.c:74:15:void dump_list2()
>>>> gcc/lto/lto-dump.c:85:13: if (!strcmp(flag_lto_dump_list2,
>>>> cnode->name()))
>>>> gcc/lto/lto-dump.c:97:16: if (!strcmp(flag_lto_dump_list2,
>>>> vnode->name()))
>>>> gcc/lto/lto-dump.h:23:9:void dump();
>>>> gcc/lto/lto-dump.h:24:14:void dump_list();
>>>> gcc/lto/lto-dump.h:25:15:void dump_list2();
>>>> gcc/lto/lang.opt:67:7:LTO Var(flag_lto_dump)
>>>> gcc/lto/lang.opt:71:7:LTO Var(flag_lto_dump_list)
>>>> gcc/lto/lang.opt:75:36:LTO Driver RejectNegative Joined
>>>> Var(flag_lto_dump_list2)
>>>> gcc/lto/lto.c:3366:8: dump();
>>>> gcc/lto/lto.c:3370:13: dump_list();
>>>> gcc/lto/lto.c:3374:14: dump_list2();
>>>>
>>>> === ERROR type #4: there should be no space before a left square bracket
>>>> (4 error(s)) ===
>>>> gcc/lto/lto-dump.c:59:19: visibility_types [DECL_VISIBILITY
>>>> (cnode->decl)]);
>>>> gcc/lto/lto-dump.c:69:19: visibility_types [DECL_VISIBILITY
>>>> (vnode->decl)]);
>>>> gcc/lto/lto-dump.c:90:20: visibility_types
>>>> [DECL_VISIBILITY (cnode->decl)]);
>>>> gcc/lto/lto-dump.c:102:20: visibility_types
>>>> [DECL_VISIBILITY (vnode->decl)]);
>>>>
>>>> === ERROR type #5: trailing whitespace (5 error(s)) ===
>>>> gcc/lto/lto-dump.c:50:0:█
>>>> gcc/lto/lto-dump.c:79:0:█
>>>> gcc/lto/lto-dump.c:92:2: }█
>>>> gcc/lto/lto-dump.c:98:3: {█
>>>> gcc/lto/lto-dump.c:105:1:}█
>>>>
>>>> And please try to avoid adding blank lines / remove blank lines in files
>>>> which you don't modify.
>>>> Examples: cgraph.c, varpool.c. Note that the checker is not 100% sure,
>>>> but will help you.
>>>>
>>>>>
>>>>> Regards,
>>>>> Hrishikesh
>>>>>
>>>>> On Tue, May 29, 2018 at 11:13 PM, Martin Liška <mliska@suse.cz> wrote:
>>>>>>
>>>>>> On 05/29/2018 07:38 PM, Martin Liška wrote:
>>>>>>>
>>>>>>> $ nm main.o
>>>>>>> 00000000 T main
>>>>>>> 00000000 T mystring
>>>>>>> 00000000 C pole
>>>>>>
>>>>>>
>>>>>> Or we can be inspired by readelf:
>>>>>>
>>>>>> $ readelf -s a.out
>>>>>> [snip]
>>>>>> Symbol table '.symtab' contains 74 entries:
>>>>>> Num: Value Size Type Bind Vis Ndx Name
>>>>>> 66: 0000000000601250 0 NOTYPE GLOBAL DEFAULT 24 _end
>>>>>> 67: 00000000004004b0 43 FUNC GLOBAL DEFAULT 13 _start
>>>>>> 68: 0000000000601038 0 NOTYPE GLOBAL DEFAULT 24 __bss_start
>>>>>> 69: 0000000000400582 70 FUNC GLOBAL DEFAULT 13 main
>>>>>> 70: 0000000000000000 0 FUNC GLOBAL DEFAULT UND
>>>>>> fwrite@@GLIBC_2.2.5
>>>>>>
>>>>>> Martin
>>>>>
>>>>>
>>>>> specific-symbols-dump.diff
>>>>>
>>>>>
>>>>> diff --git a/gcc/cgraph.c b/gcc/cgraph.c
>>>>> index 9a7d54d..b868695 100644
>>>>> --- a/gcc/cgraph.c
>>>>> +++ b/gcc/cgraph.c
>>>>> @@ -2234,6 +2234,7 @@ cgraph_node::dump (FILE *f)
>>>>> fprintf (f, " Is instrumented version.\n");
>>>>> else if (instrumented_version)
>>>>> fprintf (f, " Has instrumented version.\n");
>>>>> +
>>>>> }
>>>>>
>>>>> /* Dump call graph node NODE to stderr. */
>>>>> diff --git a/gcc/lto/Make-lang.in b/gcc/lto/Make-lang.in
>>>>> index 4695077..465662e 100644
>>>>> --- a/gcc/lto/Make-lang.in
>>>>> +++ b/gcc/lto/Make-lang.in
>>>>> @@ -22,7 +22,7 @@
>>>>> # The name of the LTO compiler.
>>>>> LTO_EXE = lto1$(exeext)
>>>>> # The LTO-specific object files inclued in $(LTO_EXE).
>>>>> -LTO_OBJS = lto/lto-lang.o lto/lto.o lto/lto-object.o attribs.o
>>>>> lto/lto-partition.o lto/lto-symtab.o
>>>>> +LTO_OBJS = lto/lto-lang.o lto/lto.o lto/lto-object.o attribs.o
>>>>> lto/lto-partition.o lto/lto-symtab.o lto/lto-dump.o
>>>>> lto_OBJS = $(LTO_OBJS)
>>>>>
>>>>> # this is only useful in a LTO bootstrap, but this does not work right
>>>>> diff --git a/gcc/lto/lang.opt b/gcc/lto/lang.opt
>>>>> index 0a408d3..7600840 100644
>>>>> --- a/gcc/lto/lang.opt
>>>>> +++ b/gcc/lto/lang.opt
>>>>> @@ -63,6 +63,18 @@ fwpa=
>>>>> LTO Driver RejectNegative Joined Var(flag_wpa)
>>>>> Whole program analysis (WPA) mode with number of parallel jobs
>>>>> specified.
>>>>>
>>>>> +fdump
>>>>> +LTO Var(flag_lto_dump)
>>>>> +Call the dump function.
>>>>> +
>>>>> +fdump-lto-list
>>>>> +LTO Var(flag_lto_dump_list)
>>>>> +Call the dump function for variables and function in IL.
>>>>> +
>>>>> +fdump-lto-list=
>>>>> +LTO Driver RejectNegative Joined Var(flag_lto_dump_list2)
>>>>> +
>>>>> +
>>>>> fresolution=
>>>>> LTO Joined
>>>>> The resolution file.
>>>>> diff --git a/gcc/lto/lto-dump.c b/gcc/lto/lto-dump.c
>>>>> new file mode 100644
>>>>> index 0000000..90976cb
>>>>> --- /dev/null
>>>>> +++ b/gcc/lto/lto-dump.c
>>>>> @@ -0,0 +1,105 @@
>>>>> +/* LTO dump tool
>>>>> + Copyright (C) 2009-2018 Free Software Foundation, Inc.
>>>>> +
>>>>> +This file is part of GCC.
>>>>> +
>>>>> +GCC is free software; you can redistribute it and/or modify it under
>>>>> +the terms of the GNU General Public License as published by the Free
>>>>> +Software Foundation; either version 3, or (at your option) any later
>>>>> +version.
>>>>> +
>>>>> +GCC is distributed in the hope that it will be useful, but WITHOUT ANY
>>>>> +WARRANTY; without even the implied warranty of MERCHANTABILITY or
>>>>> +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
>>>>> +for more details.
>>>>> +
>>>>> +You should have received a copy of the GNU General Public License
>>>>> +along with GCC; see the file COPYING3. If not see
>>>>> +<http://www.gnu.org/licenses/>. */
>>>>> +
>>>>> +#include "config.h"
>>>>> +#include "system.h"
>>>>> +#include "coretypes.h"
>>>>> +#include "target.h"
>>>>> +#include "function.h"
>>>>> +#include "basic-block.h"
>>>>> +#include "tree.h"
>>>>> +#include "gimple.h"
>>>>> +#include "cgraph.h"
>>>>> +#include "lto-streamer.h"
>>>>> +#include "ipa-utils.h"
>>>>> +#include "builtins.h"
>>>>> +#include "alias.h"
>>>>> +#include "lto-symtab.h"
>>>>> +#include "stringpool.h"
>>>>> +#include "attribs.h"
>>>>> +#include "stdio.h"
>>>>> +
>>>>> +/*Dump everything*/
>>>>> +void dump()
>>>>> +{
>>>>> + fprintf(stderr, "\nHello World!\n");
>>>>> +}
>>>>> +
>>>>> +/*Dump variables and functions used in IL*/
>>>>> +void dump_list()
>>>>> +{
>>>>> +
>>>>> + fprintf (stderr, "Call Graph:\n");
>>>>> + cgraph_node *cnode;
>>>>> +
>>>>> + static const char * const symtab_type_names[] = {"symbol",
>>>>> "function", "variable"};
>>>>> + static const char * const visibility_types[] = {
>>>>> + "default", "protected", "hidden", "internal" };
>>>>
>>>>
>>>> We have symbol_node class, this can be refactored into methods.
>>>>
>>>>> + FOR_EACH_FUNCTION (cnode)
>>>>> + {
>>>>> + fprintf (stderr, "\n%s (%s)", cnode->dump_asm_name (),
>>>>> cnode->name ());
>>>>> + fprintf (stderr, "\n Type: %s",
>>>>> symtab_type_names[cnode->type]);
>>>>> + fprintf (stderr, "\n visibility: %s\n",
>>>>> + visibility_types [DECL_VISIBILITY (cnode->decl)]);
>>>>> + }
>>>>> +
>>>>> + fprintf (stderr, "\nVarpool:\n");
>>>>> + varpool_node *vnode;
>>>>> + FOR_EACH_VARIABLE (vnode)
>>>>> + {
>>>>> + fprintf (stderr, "\n%s (%s)", vnode->dump_asm_name (),
>>>>> vnode->name ());
>>>>> + fprintf (stderr, "\n Type: %s",
>>>>> symtab_type_names[vnode->type]);
>>>>> + fprintf (stderr, "\n visibility:%s\n",
>>>>> + visibility_types [DECL_VISIBILITY (vnode->decl)]);
>>>>
>>>>
>>>> Maybe content of the loop body can be a function that will print. Now
>>>> it's copy&paste.
>>>>
>>>>> + }
>>>>> +}
>>>>> +
>>>>> +/*Dump specific variables and functions used in IL*/
>>>>> +void dump_list2()
>>>>> +{
>>>>> +
>>>>> + fprintf (stderr, "Call Graph:\n");
>>>>> + cgraph_node *cnode;
>>>>> +
>>>>> + static const char * const symtab_type_names[] = {"symbol",
>>>>> "function", "variable"};
>>>>> + static const char * const visibility_types[] = {
>>>>> + "default", "protected", "hidden", "internal" };
>>>>> + FOR_EACH_FUNCTION (cnode)
>>>>> + {
>>>>> + if (!strcmp(flag_lto_dump_list2, cnode->name()))
>>>>> + {
>>>>> + fprintf (stderr, "\n%s (%s)", cnode->dump_asm_name
>>>>> (), cnode->name ());
>>>>> + fprintf (stderr, "\n Type: %s",
>>>>> symtab_type_names[cnode->type]);
>>>>> + fprintf (stderr, "\n visibility: %s\n",
>>>>> + visibility_types [DECL_VISIBILITY (cnode->decl)]);
>>>>> + }
>>>>> + }
>>>>> + fprintf (stderr, "\nVarpool:\n");
>>>>> + varpool_node *vnode;
>>>>> + FOR_EACH_VARIABLE (vnode)
>>>>> + {
>>>>> + if (!strcmp(flag_lto_dump_list2, vnode->name()))
>>>>> + {
>>>>> + fprintf (stderr, "\n%s (%s)", vnode->dump_asm_name
>>>>> (), vnode->name ());
>>>>> + fprintf (stderr, "\n Type: %s",
>>>>> symtab_type_names[vnode->type]);
>>>>> + fprintf (stderr, "\n visibility:%s\n",
>>>>> + visibility_types [DECL_VISIBILITY (vnode->decl)]);
>>>>> + }
>>>>> + }
>>>>> +}
>>>>
>>>>
>>>> The whole function is copy&paste. Please come up with new methods for
>>>> symtab_node and use it.
>>>>
>>>> You wrote of the mailing list that you're planning to work on CMD
>>>> options. But please finish
>>>> first dumping of symbols. I would recomment to implement option that will
>>>> print body
>>>> of a function, which should accept similar dumpflags as we use for dump
>>>> files:
>>>>
>>>> $ ./xgcc -B. -fdump-tree-optimized-blocks=/dev/stdout
>>>> ~/Programming/testcases/tmp/main.c -c
>>>>
>>>> ;; Function main (main, funcdef_no=0, decl_uid=2614, cgraph_uid=0,
>>>> symbol_order=2)
>>>>
>>>> main (int argc, char * * argv)
>>>> {
>>>> int D.2621;
>>>> int _1;
>>>> int _8;
>>>> int _10;
>>>>
>>>> ;; basic block 2, loop depth 0
>>>> ;; pred: ENTRY
>>>> foo ();
>>>> fwrite (0B, 1, 0, 0B);
>>>> pole[11] = 123;
>>>> if (argc_7(D) == 1)
>>>> goto <bb 3>; [INV]
>>>> else
>>>> goto <bb 4>; [INV]
>>>> ;; succ: 3
>>>> ;; 4
>>>> ...
>>>>
>>>> $ ./xgcc -B. -fdump-tree-optimized-gimple=/dev/stdout
>>>> ~/Programming/testcases/tmp/main.c -c
>>>> int __GIMPLE ()
>>>> main (int argc, char * * argv)
>>>> {
>>>> int D_2621;
>>>> int _1;
>>>> int _8;
>>>> int _10;
>>>>
>>>> bb_2:
>>>> foo ();
>>>> fwrite (_Literal (const void * restrict) 0, 1ul, 0ul, _Literal (struct
>>>> FILE * restrict) 0);
>>>> pole[11] = 123;
>>>> if (argc_7(D) == 1)
>>>> goto bb_3;
>>>> else
>>>> goto bb_4;
>>>> ...
>>>>
>>>> And I would also do a more verbose symbol dump option that will basically
>>>> call symbol_node::debug.
>>>>
>>>> Thanks,
>>>> Martin
>>>>
>>>>> \ No newline at end of file
>>>>> diff --git a/gcc/lto/lto-dump.h b/gcc/lto/lto-dump.h
>>>>> new file mode 100644
>>>>> index 0000000..0aef8d1
>>>>> --- /dev/null
>>>>> +++ b/gcc/lto/lto-dump.h
>>>>> @@ -0,0 +1,27 @@
>>>>> +/* LTO dump tool
>>>>> + Copyright (C) 2009-2018 Free Software Foundation, Inc.
>>>>> +
>>>>> +This file is part of GCC.
>>>>> +
>>>>> +GCC is free software; you can redistribute it and/or modify it under
>>>>> +the terms of the GNU General Public License as published by the Free
>>>>> +Software Foundation; either version 3, or (at your option) any later
>>>>> +version.
>>>>> +
>>>>> +GCC is distributed in the hope that it will be useful, but WITHOUT ANY
>>>>> +WARRANTY; without even the implied warranty of MERCHANTABILITY or
>>>>> +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
>>>>> +for more details.
>>>>> +
>>>>> +You should have received a copy of the GNU General Public License
>>>>> +along with GCC; see the file COPYING3. If not see
>>>>> +<http://www.gnu.org/licenses/>. */
>>>>> +
>>>>> +#ifndef GCC_LTO_DUMP_H_
>>>>> +#define GCC_LTO_DUMP_H_
>>>>> +
>>>>> +void dump();
>>>>> +void dump_list();
>>>>> +void dump_list2();
>>>>> +
>>>>> +#endif
>>>>> \ No newline at end of file
>>>>> diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c
>>>>> index d2ccaf6..15a56af 100644
>>>>> --- a/gcc/lto/lto.c
>>>>> +++ b/gcc/lto/lto.c
>>>>> @@ -55,7 +55,7 @@ along with GCC; see the file COPYING3. If not see
>>>>> #include "fold-const.h"
>>>>> #include "attribs.h"
>>>>> #include "builtins.h"
>>>>> -
>>>>> +#include "lto-dump.h"
>>>>>
>>>>> /* Number of parallel tasks to run, -1 if we want to use GNU Make
>>>>> jobserver. */
>>>>> static int lto_parallelism;
>>>>> @@ -3361,6 +3361,18 @@ lto_main (void)
>>>>> command line. */
>>>>> read_cgraph_and_symbols (num_in_fnames, in_fnames);
>>>>>
>>>>> + /*Dump everything*/
>>>>> + if (flag_lto_dump)
>>>>> + dump();
>>>>> +
>>>>> + /*Dump variables and functions used in IL*/
>>>>> + if (flag_lto_dump_list)
>>>>> + dump_list();
>>>>> +
>>>>> + /*Dump specific variables and functions used in IL*/
>>>>> + if (flag_lto_dump_list2)
>>>>> + dump_list2();
>>>>> +
>>>>> timevar_stop (TV_PHASE_STREAM_IN);
>>>>>
>>>>> if (!seen_error ())
>>>>> diff --git a/gcc/varpool.c b/gcc/varpool.c
>>>>> index 418753c..77f0adb 100644
>>>>> --- a/gcc/varpool.c
>>>>> +++ b/gcc/varpool.c
>>>>> @@ -239,7 +239,6 @@ varpool_node::dump (FILE *f)
>>>>> fprintf (f, "\n");
>>>>> }
>>>>>
>>>>> -
>>>>> /* Dump given varpool node to stderr. */
>>>>> void varpool_node::debug (void)
>>>>> {
>>>>>
>>>>
>>