[wwwdocs] remove tree-browser page and links

Message ID 20200707085829.1459-1-hujiangping@cn.fujitsu.com
State New
Headers show
Series
  • [wwwdocs] remove tree-browser page and links
Related show

Commit Message

Hu Jiangping July 7, 2020, 8:58 a.m.
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?

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

-- 
2.17.1

Comments

Richard Sandiford July 9, 2020, 8:21 a.m. | #1
Hu Jiangping <hujiangping@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&gt; 

> -</pre>

> -

> -<p>For listing available commands, you could try:</p>

> -

> -<pre class="smallexample">

> -TB&gt; 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&gt;  

> -</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&gt; 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&gt;  

> -</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&gt; p 

> - &lt;expr_with_file_location 0x401a2aa0 

> -    type &lt;void_type 0x401a089c void VOID 

> -        align 8 symtab 0 alias set -1 

> -        pointer_to_this &lt;pointer_type 0x401a0910&gt;&gt; 

> -    side-effects public 

> -    arg 0 &lt;bind_expr 0x401a28e0 type &lt;void_type 0x401a089c void&gt; 

> -        side-effects 

> -        vars &lt;var_decl 0x401c3910 T.1 type &lt;integer_type 0x40199414 int&gt; 

> -            used SI file one.c line 10 

> -            size &lt;integer_cst 0x401964e0 constant 32&gt; 

> -            unit size &lt;integer_cst 0x40196580 constant 4&gt; 

> -            align 32 context &lt;function_decl 0x401c34fc foo&gt; chain &lt;var_decl 0x401c3984 T.2&gt;&gt; 

> -        body &lt;compound_expr 0x401a2960 type &lt;void_type 0x401a089c void&gt; 

> -            side-effects 

> -            arg 0 &lt;expr_with_file_location 0x401a2ac0 type &lt;void_type 0x401a089c void&gt; 

> -                side-effects public 

> -                arg 0 &lt;init_expr 0x401a2900 type &lt;void_type 0x401a089c void&gt; 

> -                    side-effects arg 0 &lt;var_decl 0x401c36cc i&gt; 

> -                    arg 1 &lt;integer_cst 0x401a2780 constant 0&gt;&gt; 

> -                arg 1 &lt;identifier_node 0x401c6480 one.c&gt; 

> -                one.c:3:0&gt; 

> -            arg 1 &lt;compound_expr 0x401a29a0 type &lt;void_type 0x401a089c void&gt; 

> -                side-effects 

> -                arg 0 &lt;expr_with_file_location 0x401a2b60 type &lt;integer_type 0x40199414 int&gt; 

> -                    side-effects public 

> -                    arg 0 &lt;modify_expr 0x401a2b20 type &lt;integer_type 0x40199414 int&gt; 

> -                        side-effects arg 0 &lt;var_decl 0x401c36cc i&gt; 

> -                        arg 1 &lt;plus_expr 0x401a2b00 type &lt;integer_type 0x40199414 int&gt; 

> -                            arg 0 &lt;var_decl 0x401c36cc i&gt; arg 1 &lt;integer_cst 0x40196c20 1&gt;&gt;&gt; arg 1 &lt;identifier_node 0x401c6480 one.c&gt; 

> -                    one.c:4:0&gt; 

> -                arg 1 &lt;compound_expr 0x401a2a40 type &lt;void_type 0x401a089c void&gt; 

> -                    side-effects 

> -                    arg 0 &lt;expr_with_file_location 0x401a2980 type &lt;integer_type 0x40199414 int&gt; 

> -                        side-effects public 

> -                        arg 0 &lt;call_expr 0x401a27c0 type &lt;integer_type 0x40199414 int&gt; 

> -                            side-effects arg 0 &lt;addr_expr 0x401b35d0&gt;&gt; arg 1 &lt;identifier_node 0x401c6480 one.c&gt; 

> -                        one.c:5:0&gt; 

> -                    arg 1 &lt;compound_expr 0x401a2a80 type &lt;void_type 0x401a089c void&gt; 

> -                        side-effects 

> -                        arg 0 &lt;expr_with_file_location 0x401a2a20 type &lt;void_type 0x401a089c void&gt; 

> -                            side-effects public arg 0 &lt;cond_expr 0x401a2a00&gt; arg 1 &lt;identifier_node 0x401c6480 one.c&gt; 

> -                            one.c:7:0&gt; 

> -                        arg 1 &lt;expr_with_file_location 0x401a2a60 type &lt;void_type 0x401a089c void&gt; 

> -                            side-effects public arg 0 &lt;return_expr 0x401b3768&gt; arg 1 &lt;identifier_node 0x401c6480 one.c&gt; 

> -                            one.c:12:0&gt;&gt;&gt;&gt;&gt; 

> -        block &lt;block 0x40198294 used vars &lt;var_decl 0x401c36cc i&gt; 

> -            supercontext &lt;block 0x401982c0 used supercontext &lt;function_decl 0x401c34fc foo&gt; subblocks &lt;block 0x40198294&gt;&gt;&gt;&gt; 

> -    arg 1 &lt;identifier_node 0x401c6480 one.c&gt; 

> -    one.c:3:0&gt; 

> -TB&gt;  

> -</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&gt; 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&gt; 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&gt; 

> -</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&gt; 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&gt; nx 

> -koo (), if (i != 0) 

> -  { 

> -    bar (i) 

> -  } 

> -else 

> -  { 

> -    T.1 = i * 3, T.2 = i + T.1, toons (T.2) 

> -  }, return i; 

> -TB&gt; nx 

> -if (i != 0) 

> -  { 

> -    bar (i) 

> -  } 

> -else 

> -  { 

> -    T.1 = i * 3, T.2 = i + T.1, toons (T.2) 

> -  }, return i; 

> -TB&gt;  

> -</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&gt; hpr 

> -koo (), if (i != 0) 

> -  { 

> -    bar (i) 

> -  } 

> -else 

> -  { 

> -    T.1 = i * 3, T.2 = i + T.1, toons (T.2) 

> -  }, return i; 

> -TB&gt;  

> -</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&gt; 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&gt;  

> -</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>
Gerald Pfeifer July 9, 2020, 8:49 a.m. | #2
On Thu, 9 Jul 2020, Richard Sandiford wrote:
>> 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.


Thank you, Hujp and Richard!

We generally try to avoid 404s.  So in case we remove a page put in
a redirect. You can do so via a new entry in wwwdocs/htdocs/.htaccess 
(which I believe is self explanatory, and I'm happy to help, too).

My recommendation in a case like this is to follow the approach of
adding a big banner at the top as you suggest, Richard. That said,
if the consensus by you/those working in this area is to completely
remove the page, that is perfectly fine, too.

Gerald
Hu Jiangping July 13, 2020, 2:49 a.m. | #3
> On Thu, 9 Jul 2020, Richard Sandiford wrote:

> >> 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.

> 

> Thank you, Hujp and Richard!

> 

> We generally try to avoid 404s.  So in case we remove a page put in a redirect.

> You can do so via a new entry in wwwdocs/htdocs/.htaccess (which I believe is

> self explanatory, and I'm happy to help, too).

> 

Thank you, Richard and Gerald!

Since the tree-ssa/index.html and tree-ssa/tree_browser.html are no longer
up-to-date, I think it may be better to add a redirect than to update.
Is there a page means the page which was redirected is no longer up-to-date?
Or just redirect to index.html itself as the following, it's OK?

Regards.
Hujp

---
diff --git a/htdocs/.htaccess b/htdocs/.htaccess
index 18997d63..67ee474f 100644
--- a/htdocs/.htaccess
+++ b/htdocs/.htaccess
@@ -67,6 +67,7 @@ Redirect permanent /proj-optimize.html                https://gcc.gnu.org/projects/optimize.ht
 Redirect permanent /projects.html              https://gcc.gnu.org/projects/
 Redirect permanent /projects/cxx1z.html                https://gcc.gnu.org/projects/cxx-status.html#cxx1z
 Redirect permanent /projects/web.html          https://gcc.gnu.org/about.html
+Redirect permanent /projects/tree-ssa/tree-browser.html        https://gcc.gnu.org/projects/tree-ssa/
 Redirect permanent /reghunt-howto.html         https://gcc.gnu.org/bugs/reghunt.html
 Redirect permanent /svn.html                   https://gcc.gnu.org/git.html
 Redirect permanent /svnwrite.html              https://gcc.gnu.org/gitwrite.html
--

> My recommendation in a case like this is to follow the approach of adding a big

> banner at the top as you suggest, Richard. That said, if the consensus by

> you/those working in this area is to completely remove the page, that is

> perfectly fine, too.

> 

> Gerald

>

Patch

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&gt; 
-</pre>
-
-<p>For listing available commands, you could try:</p>
-
-<pre class="smallexample">
-TB&gt; 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&gt;  
-</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&gt; 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&gt;  
-</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&gt; p 
- &lt;expr_with_file_location 0x401a2aa0 
-    type &lt;void_type 0x401a089c void VOID 
-        align 8 symtab 0 alias set -1 
-        pointer_to_this &lt;pointer_type 0x401a0910&gt;&gt; 
-    side-effects public 
-    arg 0 &lt;bind_expr 0x401a28e0 type &lt;void_type 0x401a089c void&gt; 
-        side-effects 
-        vars &lt;var_decl 0x401c3910 T.1 type &lt;integer_type 0x40199414 int&gt; 
-            used SI file one.c line 10 
-            size &lt;integer_cst 0x401964e0 constant 32&gt; 
-            unit size &lt;integer_cst 0x40196580 constant 4&gt; 
-            align 32 context &lt;function_decl 0x401c34fc foo&gt; chain &lt;var_decl 0x401c3984 T.2&gt;&gt; 
-        body &lt;compound_expr 0x401a2960 type &lt;void_type 0x401a089c void&gt; 
-            side-effects 
-            arg 0 &lt;expr_with_file_location 0x401a2ac0 type &lt;void_type 0x401a089c void&gt; 
-                side-effects public 
-                arg 0 &lt;init_expr 0x401a2900 type &lt;void_type 0x401a089c void&gt; 
-                    side-effects arg 0 &lt;var_decl 0x401c36cc i&gt; 
-                    arg 1 &lt;integer_cst 0x401a2780 constant 0&gt;&gt; 
-                arg 1 &lt;identifier_node 0x401c6480 one.c&gt; 
-                one.c:3:0&gt; 
-            arg 1 &lt;compound_expr 0x401a29a0 type &lt;void_type 0x401a089c void&gt; 
-                side-effects 
-                arg 0 &lt;expr_with_file_location 0x401a2b60 type &lt;integer_type 0x40199414 int&gt; 
-                    side-effects public 
-                    arg 0 &lt;modify_expr 0x401a2b20 type &lt;integer_type 0x40199414 int&gt; 
-                        side-effects arg 0 &lt;var_decl 0x401c36cc i&gt; 
-                        arg 1 &lt;plus_expr 0x401a2b00 type &lt;integer_type 0x40199414 int&gt; 
-                            arg 0 &lt;var_decl 0x401c36cc i&gt; arg 1 &lt;integer_cst 0x40196c20 1&gt;&gt;&gt; arg 1 &lt;identifier_node 0x401c6480 one.c&gt; 
-                    one.c:4:0&gt; 
-                arg 1 &lt;compound_expr 0x401a2a40 type &lt;void_type 0x401a089c void&gt; 
-                    side-effects 
-                    arg 0 &lt;expr_with_file_location 0x401a2980 type &lt;integer_type 0x40199414 int&gt; 
-                        side-effects public 
-                        arg 0 &lt;call_expr 0x401a27c0 type &lt;integer_type 0x40199414 int&gt; 
-                            side-effects arg 0 &lt;addr_expr 0x401b35d0&gt;&gt; arg 1 &lt;identifier_node 0x401c6480 one.c&gt; 
-                        one.c:5:0&gt; 
-                    arg 1 &lt;compound_expr 0x401a2a80 type &lt;void_type 0x401a089c void&gt; 
-                        side-effects 
-                        arg 0 &lt;expr_with_file_location 0x401a2a20 type &lt;void_type 0x401a089c void&gt; 
-                            side-effects public arg 0 &lt;cond_expr 0x401a2a00&gt; arg 1 &lt;identifier_node 0x401c6480 one.c&gt; 
-                            one.c:7:0&gt; 
-                        arg 1 &lt;expr_with_file_location 0x401a2a60 type &lt;void_type 0x401a089c void&gt; 
-                            side-effects public arg 0 &lt;return_expr 0x401b3768&gt; arg 1 &lt;identifier_node 0x401c6480 one.c&gt; 
-                            one.c:12:0&gt;&gt;&gt;&gt;&gt; 
-        block &lt;block 0x40198294 used vars &lt;var_decl 0x401c36cc i&gt; 
-            supercontext &lt;block 0x401982c0 used supercontext &lt;function_decl 0x401c34fc foo&gt; subblocks &lt;block 0x40198294&gt;&gt;&gt;&gt; 
-    arg 1 &lt;identifier_node 0x401c6480 one.c&gt; 
-    one.c:3:0&gt; 
-TB&gt;  
-</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&gt; 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&gt; 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&gt; 
-</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&gt; 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&gt; nx 
-koo (), if (i != 0) 
-  { 
-    bar (i) 
-  } 
-else 
-  { 
-    T.1 = i * 3, T.2 = i + T.1, toons (T.2) 
-  }, return i; 
-TB&gt; nx 
-if (i != 0) 
-  { 
-    bar (i) 
-  } 
-else 
-  { 
-    T.1 = i * 3, T.2 = i + T.1, toons (T.2) 
-  }, return i; 
-TB&gt;  
-</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&gt; hpr 
-koo (), if (i != 0) 
-  { 
-    bar (i) 
-  } 
-else 
-  { 
-    T.1 = i * 3, T.2 = i + T.1, toons (T.2) 
-  }, return i; 
-TB&gt;  
-</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&gt; 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&gt;  
-</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>