Hu Jiangping <hujiangp...@cn.fujitsu.com> writes: > Hi, > > I'm trying Tree Browser during debugging, but failed. > I found that tree-browser.c and tree-browser.def have been > removed at 2015-07-25. So, to avoid misunderstanding, > can we remove this tree-browser page too?
Thanks for the patch. Seems like a good idea to me. I guess the only question is whether we should keep it around for historical purposes, but with a big banner to say that it's no longer up-to-date. I also don't know whether we try to avoid 404s on old pages. Gerald, WDYT? Richard > > Regards. > hujp > > --- > htdocs/projects/tree-ssa/index.html | 6 - > htdocs/projects/tree-ssa/tree-browser.html | 306 --------------------- > 2 files changed, 312 deletions(-) > delete mode 100644 htdocs/projects/tree-ssa/tree-browser.html > > diff --git a/htdocs/projects/tree-ssa/index.html > b/htdocs/projects/tree-ssa/index.html > index a15d0f32..930df390 100644 > --- a/htdocs/projects/tree-ssa/index.html > +++ b/htdocs/projects/tree-ssa/index.html > @@ -21,7 +21,6 @@ > <li><a href="#gimple">GENERIC and GIMPLE</a></li> > <li><a href="#ssa">SSA implementation</a></li> > <li><a href="#unparse">Unparsing GENERIC trees</a></li> > -<li><a href="#tb">Tree Browser</a></li> > <li><a href="#status">Implementation Status (last updated: > 2003-11-22)</a></li> > <li><a href="#todo">TODO list (last updated: 2003-12-27)</a></li> > </ul> > @@ -221,11 +220,6 @@ functions that given a GENERIC tree node, they print a C > representation of > the tree. The output is not meant to be compilable, but it is of great > help when debugging transformations done by the transformation passes.</p> > > -<hr /> > -<h2 id="tb">Tree Browser</h2> > -For debugging, browsing, discovering, and playing with trees you can > -use the <a href="tree-browser.html">Tree Browser</a> directly from gdb. > - > <hr /> > <h2 id="status">Implementation Status</h2> > > diff --git a/htdocs/projects/tree-ssa/tree-browser.html > b/htdocs/projects/tree-ssa/tree-browser.html > deleted file mode 100644 > index ce95a103..00000000 > --- a/htdocs/projects/tree-ssa/tree-browser.html > +++ /dev/null > @@ -1,306 +0,0 @@ > -<!DOCTYPE html> > -<html lang="en"> > - > -<head> > -<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> > -<title>Tree Browser</title> > -<link rel="stylesheet" type="text/css" href="https://gcc.gnu.org/gcc.css" /> > -</head> > - > - <body> > - <h1>Tree Browser</h1> > - > -<p>Until recently the only way to debug trees from gdb was to call > -debug_tree as follows:</p> > - > -<pre class="smallexample"> > -(gdb) p debug_tree (current_function_decl) > -</pre> > - > -<p>An alternative for interactively scan tree structures is to use the > -Tree Browser. You can access Tree Browser from anywhere during a debugging > -session as follows:</p> > - > -<pre class="smallexample"> > -(gdb) p browse_tree (current_function_decl) > - > -Tree Browser > -foo > -Up/prev expressions updated. > -TB> > -</pre> > - > -<p>For listing available commands, you could try:</p> > - > -<pre class="smallexample"> > -TB> h > -Possible commands are: > - > - x - Exits tree-browser. > - q - Exits tree-browser. > - h - Prints this help message. > - update - Update information about parent expressions. > - verbose - Sets/unsets verbose mode (default is on). > - fun - Go to the current function declaration. > - nx - Go to the next expression in a BIND_EXPR. > - pr - Go to the previous expression in a BIND_EXPR. > - up - Go to the parent tree node. > - last - Go to the last expression in a BIND_EXPR. > - first - Go to the first expression in a BIND_EXPR. > - hpr - Go to the previous visited node (history previous). > - arg0 - Child 0. > - arg1 - Child 1. > - arg2 - Child 2. > - arg3 - Child 3. > - decl_saved_tree - Body of a function. > - type - Field accessor. > - size - Field accessor. > - unit_size - Field accessor. > - offset - Field accessor. > - bit_offset - Field accessor. > - context - Field accessor. > - attributes - Field accessor. > - abstract_origin - Field accessor. > - arguments - Field accessor. > - result - Field accessor. > - initial - Field accessor. > - arg-type - Field accessor. > - arg-type-as-written - Field accessor. > - chain - Field accessor. > - values - Field accessor. > - domain - Field accessor. > - method_basetype - Field accessor. > - fields - Field accessor. > - arg-types - Field accessor. > - basetype - Field accessor. > - pointer_to_this - Field accessor. > - reference_to_this - Field accessor. > - vars - Field accessor. > - supercontext - Field accessor. > - body - Field accessor. > - subblocks - Field accessor. > - block - Field accessor. > - real - Field accessor. > - imag - Field accessor. > - purpose - Field accessor. > - value - Field accessor. > - elt - Field accessor. > - min - Field accessor. > - max - Field accessor. > - sc - Search a node having a TREE_CODE given as a > parameter. > - sn - Search an identifier having a name given as a > parameter. > - pp - Pretty print current node. > - p - Prints the current node. > -TB> > -</pre> > - > -<p>Note that this list of commands is susceptible to change, since this > -is a pretty new tool and is still in development.</p> > - > -<p>Now let's try some of these commands: we're on the declaration of the > -current function, we can have a look at its body.</p> > - > -<pre class="smallexample"> > -TB> decl_saved_tree > -{ > - int T.1; > - int T.2; > - int i; > - extern koo; > - extern bar; > - extern toons; > - > - i = 0, i = i + 1, koo (), if (i != 0) > - { > - bar (i) > - } > - else > - { > - T.1 = i * 3, T.2 = i + T.1, toons (T.2) > - }, return i; > -} > -TB> > -</pre> > - > -<p>The above output is a pretty-print of the body of the current function. > -A call to debug_tree would have printed more things about the structure of > -the Abstract Syntax Trees (AST), as follows:</p> > - > -<pre class="smallexample"> > -TB> p > - <expr_with_file_location 0x401a2aa0 > - type <void_type 0x401a089c void VOID > - align 8 symtab 0 alias set -1 > - pointer_to_this <pointer_type 0x401a0910>> > - side-effects public > - arg 0 <bind_expr 0x401a28e0 type <void_type 0x401a089c void> > - side-effects > - vars <var_decl 0x401c3910 T.1 type <integer_type 0x40199414 > int> > - used SI file one.c line 10 > - size <integer_cst 0x401964e0 constant 32> > - unit size <integer_cst 0x40196580 constant 4> > - align 32 context <function_decl 0x401c34fc foo> chain > <var_decl 0x401c3984 T.2>> > - body <compound_expr 0x401a2960 type <void_type 0x401a089c > void> > - side-effects > - arg 0 <expr_with_file_location 0x401a2ac0 type <void_type > 0x401a089c void> > - side-effects public > - arg 0 <init_expr 0x401a2900 type <void_type 0x401a089c > void> > - side-effects arg 0 <var_decl 0x401c36cc i> > - arg 1 <integer_cst 0x401a2780 constant 0>> > - arg 1 <identifier_node 0x401c6480 one.c> > - one.c:3:0> > - arg 1 <compound_expr 0x401a29a0 type <void_type 0x401a089c > void> > - side-effects > - arg 0 <expr_with_file_location 0x401a2b60 type > <integer_type 0x40199414 int> > - side-effects public > - arg 0 <modify_expr 0x401a2b20 type <integer_type > 0x40199414 int> > - side-effects arg 0 <var_decl 0x401c36cc i> > - arg 1 <plus_expr 0x401a2b00 type <integer_type > 0x40199414 int> > - arg 0 <var_decl 0x401c36cc i> arg 1 > <integer_cst 0x40196c20 1>>> arg 1 <identifier_node 0x401c6480 > one.c> > - one.c:4:0> > - arg 1 <compound_expr 0x401a2a40 type <void_type > 0x401a089c void> > - side-effects > - arg 0 <expr_with_file_location 0x401a2980 type > <integer_type 0x40199414 int> > - side-effects public > - arg 0 <call_expr 0x401a27c0 type <integer_type > 0x40199414 int> > - side-effects arg 0 <addr_expr > 0x401b35d0>> arg 1 <identifier_node 0x401c6480 one.c> > - one.c:5:0> > - arg 1 <compound_expr 0x401a2a80 type <void_type > 0x401a089c void> > - side-effects > - arg 0 <expr_with_file_location 0x401a2a20 type > <void_type 0x401a089c void> > - side-effects public arg 0 <cond_expr > 0x401a2a00> arg 1 <identifier_node 0x401c6480 one.c> > - one.c:7:0> > - arg 1 <expr_with_file_location 0x401a2a60 type > <void_type 0x401a089c void> > - side-effects public arg 0 <return_expr > 0x401b3768> arg 1 <identifier_node 0x401c6480 one.c> > - one.c:12:0>>>>> > - block <block 0x40198294 used vars <var_decl 0x401c36cc i> > - supercontext <block 0x401982c0 used supercontext > <function_decl 0x401c34fc foo> subblocks <block > 0x40198294>>>> > - arg 1 <identifier_node 0x401c6480 one.c> > - one.c:3:0> > -TB> > -</pre> > - > -<p>An interesting thing to remark in this dumping is that a node is > -represented as a well parenthesized expression. Each tree node contains > -several fields that are in general aligned at the same indentation level. > -For example BIND_EXPR has a child called vars (a set of variabl > -definitions), a body, and a block. All these fields are accessible from > -Tree Browser.</p> > - > -<p>Thus if we continue our exploration of the current tree structure,</p> > - > -<pre class="smallexample"> > -TB> arg0 > -{ > - int T.1; > - int T.2; > - int i; > - extern koo; > - extern bar; > - extern toons; > - > - i = 0, i = i + 1, koo (), if (i != 0) > - { > - bar (i) > - } > - else > - { > - T.1 = i * 3, T.2 = i + T.1, toons (T.2) > - }, return i; > -} > -TB> body > -i = 0, i = i + 1, koo (), if (i != 0) > - { > - bar (i) > - } > -else > - { > - T.1 = i * 3, T.2 = i + T.1, toons (T.2) > - }, return i; > -TB> > -</pre> > - > -<p>Here I have to write some notes on the current chaining of expressions > -procedure. A compound_expr contains two operands: arg0 the child that > -contains the expression and arg1 the child that contains the rest of the > -list of expressions. In arg0 GCC stores an expr_with_file_location node > -that contains the expression and an information about the position of this > -expression in the original source code.</p> > - > -<p>For accessing the next expression you can use the next command:</p> > - > -<pre class="smallexample"> > -TB> nx > -i = i + 1, koo (), if (i != 0) > - { > - bar (i) > - } > -else > - { > - T.1 = i * 3, T.2 = i + T.1, toons (T.2) > - }, return i; > -TB> nx > -koo (), if (i != 0) > - { > - bar (i) > - } > -else > - { > - T.1 = i * 3, T.2 = i + T.1, toons (T.2) > - }, return i; > -TB> nx > -if (i != 0) > - { > - bar (i) > - } > -else > - { > - T.1 = i * 3, T.2 = i + T.1, toons (T.2) > - }, return i; > -TB> > -</pre> > - > -<p>You can choose to go backwards via the history stack: this pops the > -last visited node from the stack.</p> > - > -<pre class="smallexample"> > -TB> hpr > -koo (), if (i != 0) > - { > - bar (i) > - } > -else > - { > - T.1 = i * 3, T.2 = i + T.1, toons (T.2) > - }, return i; > -TB> > -</pre> > - > -<p>Or via the previous expression command (this information is not > -yet included in GCC's trees, Tree Browser stores it in a hash table):</p> > - > -<pre class="smallexample"> > -TB> pr > -i = i + 1, koo (), if (i != 0) > - { > - bar (i) > - } > -else > - { > - T.1 = i * 3, T.2 = i + T.1, toons (T.2) > - }, return i; > -TB> > -</pre> > - > - <h1> Extensions </h1> > - > -<p>Some extensions could be added in the near future, such as including > -commands that allows you to modify tree structure, apply optimizations > -locally on a given node.</p> > - > -<p>A more interesting but much more long term project is to write > -an interactive program editor/optimizer, but for the moment this is only > -science fiction... :-)</p> > - > - </body> > -</html>