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 <mli...@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)
{