Commit 8d2ccbd2 by Sebastian Pop Committed by Sebastian Pop

remove tree-browser

	* Makefile.in: Remove use of TREEBROWSER.
	* config.in: Regenerated.
	* configure: Regenerated.
	* configure.ac: Remove definition of TREEBROWSER.
	* tree-browser.c: Removed.
	* tree-browser.def: Removed.

From-SVN: r226214
parent 33df361a
2015-07-25 Sebastian Pop <s.pop@samsung.com> 2015-07-25 Sebastian Pop <s.pop@samsung.com>
* Makefile.in: Remove use of TREEBROWSER.
* config.in: Regenerated.
* configure: Regenerated.
* configure.ac: Remove definition of TREEBROWSER.
* tree-browser.c: Removed.
* tree-browser.def: Removed.
2015-07-25 Sebastian Pop <s.pop@samsung.com>
* graphite-scop-detection.c: Include gimple-pretty-print.h. * graphite-scop-detection.c: Include gimple-pretty-print.h.
(stmt_simple_for_scop_p): Print when a stmt is not handled in (stmt_simple_for_scop_p): Print when a stmt is not handled in
Graphite. Graphite.
......
...@@ -1525,7 +1525,7 @@ OBJS-libcommon-target = $(common_out_object_file) prefix.o params.o \ ...@@ -1525,7 +1525,7 @@ OBJS-libcommon-target = $(common_out_object_file) prefix.o params.o \
ALL_HOST_FRONTEND_OBJS = $(foreach v,$(CONFIG_LANGUAGES),$($(v)_OBJS)) ALL_HOST_FRONTEND_OBJS = $(foreach v,$(CONFIG_LANGUAGES),$($(v)_OBJS))
ALL_HOST_BACKEND_OBJS = $(GCC_OBJS) $(OBJS) $(OBJS-libcommon) \ ALL_HOST_BACKEND_OBJS = $(GCC_OBJS) $(OBJS) $(OBJS-libcommon) \
$(OBJS-libcommon-target) @TREEBROWSER@ main.o c-family/cppspec.o \ $(OBJS-libcommon-target) main.o c-family/cppspec.o \
$(COLLECT2_OBJS) $(EXTRA_GCC_OBJS) $(GCOV_OBJS) $(GCOV_DUMP_OBJS) \ $(COLLECT2_OBJS) $(EXTRA_GCC_OBJS) $(GCOV_OBJS) $(GCOV_DUMP_OBJS) \
$(GCOV_TOOL_OBJS) $(GENGTYPE_OBJS) gcc-ar.o gcc-nm.o gcc-ranlib.o \ $(GCOV_TOOL_OBJS) $(GENGTYPE_OBJS) gcc-ar.o gcc-nm.o gcc-ranlib.o \
lto-wrapper.o collect-utils.o lto-wrapper.o collect-utils.o
...@@ -1534,7 +1534,7 @@ ALL_HOST_BACKEND_OBJS = $(GCC_OBJS) $(OBJS) $(OBJS-libcommon) \ ...@@ -1534,7 +1534,7 @@ ALL_HOST_BACKEND_OBJS = $(GCC_OBJS) $(OBJS) $(OBJS-libcommon) \
# compilation or not. # compilation or not.
ALL_HOST_OBJS = $(ALL_HOST_FRONTEND_OBJS) $(ALL_HOST_BACKEND_OBJS) ALL_HOST_OBJS = $(ALL_HOST_FRONTEND_OBJS) $(ALL_HOST_BACKEND_OBJS)
BACKEND = libbackend.a main.o @TREEBROWSER@ libcommon-target.a libcommon.a \ BACKEND = libbackend.a main.o libcommon-target.a libcommon.a \
$(CPPLIB) $(LIBDECNUMBER) $(CPPLIB) $(LIBDECNUMBER)
# This is defined to "yes" if Tree checking is enabled, which roughly means # This is defined to "yes" if Tree checking is enabled, which roughly means
......
...@@ -194,8 +194,7 @@ ...@@ -194,8 +194,7 @@
/* Define if you want all operations on trees (the basic data structure of the /* Define if you want all operations on trees (the basic data structure of the
front ends) to be checked for dynamic type safety at runtime. This is front ends) to be checked for dynamic type safety at runtime. This is
moderately expensive. The tree browser debugging routines will also be moderately expensive. */
enabled by this option. */
#ifndef USED_FOR_TARGET #ifndef USED_FOR_TARGET
#undef ENABLE_TREE_CHECKING #undef ENABLE_TREE_CHECKING
#endif #endif
......
...@@ -781,7 +781,6 @@ valgrind_command ...@@ -781,7 +781,6 @@ valgrind_command
valgrind_path_defines valgrind_path_defines
valgrind_path valgrind_path
TREECHECKING TREECHECKING
TREEBROWSER
nocommon_flag nocommon_flag
noexception_flags noexception_flags
warn_cxxflags warn_cxxflags
...@@ -7085,7 +7084,6 @@ if test x$ac_tree_checking != x ; then ...@@ -7085,7 +7084,6 @@ if test x$ac_tree_checking != x ; then
$as_echo "#define ENABLE_TREE_CHECKING 1" >>confdefs.h $as_echo "#define ENABLE_TREE_CHECKING 1" >>confdefs.h
TREEBROWSER=tree-browser.o
TREECHECKING=yes TREECHECKING=yes
fi fi
if test x$ac_types_checking != x ; then if test x$ac_types_checking != x ; then
...@@ -7094,7 +7092,6 @@ $as_echo "#define ENABLE_TYPES_CHECKING 1" >>confdefs.h ...@@ -7094,7 +7092,6 @@ $as_echo "#define ENABLE_TYPES_CHECKING 1" >>confdefs.h
fi fi
if test x$ac_rtl_checking != x ; then if test x$ac_rtl_checking != x ; then
$as_echo "#define ENABLE_RTL_CHECKING 1" >>confdefs.h $as_echo "#define ENABLE_RTL_CHECKING 1" >>confdefs.h
...@@ -18304,7 +18301,7 @@ else ...@@ -18304,7 +18301,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF cat > conftest.$ac_ext <<_LT_EOF
#line 18307 "configure" #line 18304 "configure"
#include "confdefs.h" #include "confdefs.h"
#if HAVE_DLFCN_H #if HAVE_DLFCN_H
...@@ -18410,7 +18407,7 @@ else ...@@ -18410,7 +18407,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF cat > conftest.$ac_ext <<_LT_EOF
#line 18413 "configure" #line 18410 "configure"
#include "confdefs.h" #include "confdefs.h"
#if HAVE_DLFCN_H #if HAVE_DLFCN_H
......
...@@ -569,10 +569,8 @@ if test x$ac_tree_checking != x ; then ...@@ -569,10 +569,8 @@ if test x$ac_tree_checking != x ; then
AC_DEFINE(ENABLE_TREE_CHECKING, 1, AC_DEFINE(ENABLE_TREE_CHECKING, 1,
[Define if you want all operations on trees (the basic data [Define if you want all operations on trees (the basic data
structure of the front ends) to be checked for dynamic type safety structure of the front ends) to be checked for dynamic type safety
at runtime. This is moderately expensive. The tree browser debugging at runtime. This is moderately expensive.
routines will also be enabled by this option.
]) ])
TREEBROWSER=tree-browser.o
TREECHECKING=yes TREECHECKING=yes
fi fi
if test x$ac_types_checking != x ; then if test x$ac_types_checking != x ; then
...@@ -581,7 +579,6 @@ if test x$ac_types_checking != x ; then ...@@ -581,7 +579,6 @@ if test x$ac_types_checking != x ; then
This is cheap. This is cheap.
]) ])
fi fi
AC_SUBST(TREEBROWSER)
AC_SUBST(TREECHECKING) AC_SUBST(TREECHECKING)
if test x$ac_rtl_checking != x ; then if test x$ac_rtl_checking != x ; then
AC_DEFINE(ENABLE_RTL_CHECKING, 1, AC_DEFINE(ENABLE_RTL_CHECKING, 1,
......
/* Tree browser.
Copyright (C) 2002-2015 Free Software Foundation, Inc.
Contributed by Sebastian Pop <s.pop@laposte.net>
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 "alias.h"
#include "tree.h"
#include "options.h"
#include "tree-pretty-print.h"
#include "print-tree.h"
#define TB_OUT_FILE stdout
#define TB_IN_FILE stdin
#define TB_NIY fprintf (TB_OUT_FILE, "Sorry this command is not yet implemented.\n")
#define TB_WF fprintf (TB_OUT_FILE, "Warning, this command failed.\n")
/* Structures for handling Tree Browser's commands. */
#define DEFTBCODE(COMMAND, STRING, HELP) COMMAND,
enum TB_Comm_code {
#include "tree-browser.def"
TB_UNUSED_COMMAND
};
#undef DEFTBCODE
typedef enum TB_Comm_code TB_CODE;
struct tb_command {
const char *help_msg;
const char *comm_text;
size_t comm_len;
TB_CODE comm_code;
};
#define DEFTBCODE(code, str, help) { help, str, sizeof (str) - 1, code },
static const struct tb_command tb_commands[] =
{
#include "tree-browser.def"
};
#undef DEFTBCODE
#define TB_COMMAND_LEN(N) (tb_commands[N].comm_len)
#define TB_COMMAND_TEXT(N) (tb_commands[N].comm_text)
#define TB_COMMAND_CODE(N) (tb_commands[N].comm_code)
#define TB_COMMAND_HELP(N) (tb_commands[N].help_msg)
/* Next structure is for parsing TREE_CODEs. */
struct tb_tree_code {
enum tree_code code;
const char *code_string;
size_t code_string_len;
};
#define DEFTREECODE(SYM, STRING, TYPE, NARGS) { SYM, STRING, sizeof (STRING) - 1 },
#define END_OF_BASE_TREE_CODES \
{ LAST_AND_UNUSED_TREE_CODE, "@dummy", sizeof ("@dummy") - 1 },
static const struct tb_tree_code tb_tree_codes[] =
{
#include "all-tree.def"
};
#undef DEFTREECODE
#undef END_OF_BASE_TREE_CODES
#define TB_TREE_CODE(N) (tb_tree_codes[N].code)
#define TB_TREE_CODE_TEXT(N) (tb_tree_codes[N].code_string)
#define TB_TREE_CODE_LEN(N) (tb_tree_codes[N].code_string_len)
/* Function declarations. */
static long TB_getline (char **, long *, FILE *);
static TB_CODE TB_get_command (char *);
static enum tree_code TB_get_tree_code (char *);
static tree find_node_with_code (tree *, int *, void *);
static tree store_child_info (tree *, int *, void *);
static void TB_update_up (tree);
static tree TB_current_chain_node (tree);
static tree TB_prev_expr (tree);
static tree TB_next_expr (tree);
static tree TB_up_expr (tree);
static tree TB_first_in_bind (tree);
static tree TB_last_in_bind (tree);
static tree TB_history_prev (void);
/* FIXME: To be declared in a .h file. */
void browse_tree (tree);
/* Hashtable helpers. */
struct tree_upper_hasher : nofree_ptr_hash<tree_node>
{
static inline bool equal (const value_type &, const compare_type &);
};
inline bool
tree_upper_hasher::equal (const value_type &parent, const compare_type &node)
{
if (parent == NULL || node == NULL)
return 0;
if (EXPR_P (parent))
{
int n = TREE_OPERAND_LENGTH (parent);
int i;
for (i = 0; i < n; i++)
if (node == TREE_OPERAND (parent, i))
return true;
}
return false;
}
/* Static variables. */
static hash_table<tree_upper_hasher> *TB_up_ht;
static vec<tree, va_gc> *TB_history_stack;
static int TB_verbose = 1;
/* Entry point in the Tree Browser. */
void
browse_tree (tree begin)
{
tree head;
TB_CODE tbc = TB_UNUSED_COMMAND;
ssize_t rd;
char *input = NULL;
long input_size = 0;
fprintf (TB_OUT_FILE, "\nTree Browser\n");
#define TB_SET_HEAD(N) do { \
vec_safe_push (TB_history_stack, N); \
head = N; \
if (TB_verbose) \
if (head) \
{ \
print_generic_expr (TB_OUT_FILE, head, 0); \
fprintf (TB_OUT_FILE, "\n"); \
} \
} while (0)
TB_SET_HEAD (begin);
/* Store in a hashtable information about previous and upper statements. */
{
TB_up_ht = new hash_table<tree_upper_hasher> (1023);
TB_update_up (head);
}
while (24)
{
fprintf (TB_OUT_FILE, "TB> ");
rd = TB_getline (&input, &input_size, TB_IN_FILE);
if (rd == -1)
/* EOF. */
goto ret;
if (rd != 1)
/* Get a new command. Otherwise the user just pressed enter, and thus
she expects the last command to be reexecuted. */
tbc = TB_get_command (input);
switch (tbc)
{
case TB_UPDATE_UP:
TB_update_up (head);
break;
case TB_MAX:
if (head && (INTEGRAL_TYPE_P (head)
|| TREE_CODE (head) == REAL_TYPE
|| TREE_CODE (head) == FIXED_POINT_TYPE))
TB_SET_HEAD (TYPE_MAX_VALUE (head));
else
TB_WF;
break;
case TB_MIN:
if (head && (INTEGRAL_TYPE_P (head)
|| TREE_CODE (head) == REAL_TYPE
|| TREE_CODE (head) == FIXED_POINT_TYPE))
TB_SET_HEAD (TYPE_MIN_VALUE (head));
else
TB_WF;
break;
case TB_ELT:
if (head && TREE_CODE (head) == TREE_VEC)
{
/* This command takes another argument: the element number:
for example "elt 1". */
TB_NIY;
}
else if (head && TREE_CODE (head) == VECTOR_CST)
{
/* This command takes another argument: the element number:
for example "elt 1". */
TB_NIY;
}
else
TB_WF;
break;
case TB_VALUE:
if (head && TREE_CODE (head) == TREE_LIST)
TB_SET_HEAD (TREE_VALUE (head));
else
TB_WF;
break;
case TB_PURPOSE:
if (head && TREE_CODE (head) == TREE_LIST)
TB_SET_HEAD (TREE_PURPOSE (head));
else
TB_WF;
break;
case TB_IMAG:
if (head && TREE_CODE (head) == COMPLEX_CST)
TB_SET_HEAD (TREE_IMAGPART (head));
else
TB_WF;
break;
case TB_REAL:
if (head && TREE_CODE (head) == COMPLEX_CST)
TB_SET_HEAD (TREE_REALPART (head));
else
TB_WF;
break;
case TB_BLOCK:
if (head && TREE_CODE (head) == BIND_EXPR)
TB_SET_HEAD (TREE_OPERAND (head, 2));
else
TB_WF;
break;
case TB_SUBBLOCKS:
if (head && TREE_CODE (head) == BLOCK)
TB_SET_HEAD (BLOCK_SUBBLOCKS (head));
else
TB_WF;
break;
case TB_SUPERCONTEXT:
if (head && TREE_CODE (head) == BLOCK)
TB_SET_HEAD (BLOCK_SUPERCONTEXT (head));
else
TB_WF;
break;
case TB_VARS:
if (head && TREE_CODE (head) == BLOCK)
TB_SET_HEAD (BLOCK_VARS (head));
else if (head && TREE_CODE (head) == BIND_EXPR)
TB_SET_HEAD (TREE_OPERAND (head, 0));
else
TB_WF;
break;
case TB_REFERENCE_TO_THIS:
if (head && TYPE_P (head))
TB_SET_HEAD (TYPE_REFERENCE_TO (head));
else
TB_WF;
break;
case TB_POINTER_TO_THIS:
if (head && TYPE_P (head))
TB_SET_HEAD (TYPE_POINTER_TO (head));
else
TB_WF;
break;
case TB_BASETYPE:
if (head && TREE_CODE (head) == OFFSET_TYPE)
TB_SET_HEAD (TYPE_OFFSET_BASETYPE (head));
else
TB_WF;
break;
case TB_ARG_TYPES:
if (head && (TREE_CODE (head) == FUNCTION_TYPE
|| TREE_CODE (head) == METHOD_TYPE))
TB_SET_HEAD (TYPE_ARG_TYPES (head));
else
TB_WF;
break;
case TB_METHOD_BASE_TYPE:
if (head && (TREE_CODE (head) == FUNCTION_TYPE
|| TREE_CODE (head) == METHOD_TYPE)
&& TYPE_METHOD_BASETYPE (head))
TB_SET_HEAD (TYPE_METHOD_BASETYPE (head));
else
TB_WF;
break;
case TB_FIELDS:
if (head && (TREE_CODE (head) == RECORD_TYPE
|| TREE_CODE (head) == UNION_TYPE
|| TREE_CODE (head) == QUAL_UNION_TYPE))
TB_SET_HEAD (TYPE_FIELDS (head));
else
TB_WF;
break;
case TB_DOMAIN:
if (head && TREE_CODE (head) == ARRAY_TYPE)
TB_SET_HEAD (TYPE_DOMAIN (head));
else
TB_WF;
break;
case TB_VALUES:
if (head && TREE_CODE (head) == ENUMERAL_TYPE)
TB_SET_HEAD (TYPE_VALUES (head));
else
TB_WF;
break;
case TB_ARG_TYPE:
if (head && TREE_CODE (head) == PARM_DECL)
TB_SET_HEAD (DECL_ARG_TYPE (head));
else
TB_WF;
break;
case TB_INITIAL:
if (head && DECL_P (head))
TB_SET_HEAD (DECL_INITIAL (head));
else
TB_WF;
break;
case TB_RESULT:
if (head && DECL_P (head))
TB_SET_HEAD (DECL_RESULT_FLD (head));
else
TB_WF;
break;
case TB_ARGUMENTS:
if (head && DECL_P (head))
TB_SET_HEAD (DECL_ARGUMENTS (head));
else
TB_WF;
break;
case TB_ABSTRACT_ORIGIN:
if (head && DECL_P (head))
TB_SET_HEAD (DECL_ABSTRACT_ORIGIN (head));
else if (head && TREE_CODE (head) == BLOCK)
TB_SET_HEAD (BLOCK_ABSTRACT_ORIGIN (head));
else
TB_WF;
break;
case TB_ATTRIBUTES:
if (head && DECL_P (head))
TB_SET_HEAD (DECL_ATTRIBUTES (head));
else if (head && TYPE_P (head))
TB_SET_HEAD (TYPE_ATTRIBUTES (head));
else
TB_WF;
break;
case TB_CONTEXT:
if (head && DECL_P (head))
TB_SET_HEAD (DECL_CONTEXT (head));
else if (head && TYPE_P (head)
&& TYPE_CONTEXT (head))
TB_SET_HEAD (TYPE_CONTEXT (head));
else
TB_WF;
break;
case TB_OFFSET:
if (head && TREE_CODE (head) == FIELD_DECL)
TB_SET_HEAD (DECL_FIELD_OFFSET (head));
else
TB_WF;
break;
case TB_BIT_OFFSET:
if (head && TREE_CODE (head) == FIELD_DECL)
TB_SET_HEAD (DECL_FIELD_BIT_OFFSET (head));
else
TB_WF;
break;
case TB_UNIT_SIZE:
if (head && DECL_P (head))
TB_SET_HEAD (DECL_SIZE_UNIT (head));
else if (head && TYPE_P (head))
TB_SET_HEAD (TYPE_SIZE_UNIT (head));
else
TB_WF;
break;
case TB_SIZE:
if (head && DECL_P (head))
TB_SET_HEAD (DECL_SIZE (head));
else if (head && TYPE_P (head))
TB_SET_HEAD (TYPE_SIZE (head));
else
TB_WF;
break;
case TB_TYPE:
if (head && TREE_TYPE (head))
TB_SET_HEAD (TREE_TYPE (head));
else
TB_WF;
break;
case TB_DECL_SAVED_TREE:
if (head && TREE_CODE (head) == FUNCTION_DECL
&& DECL_SAVED_TREE (head))
TB_SET_HEAD (DECL_SAVED_TREE (head));
else
TB_WF;
break;
case TB_BODY:
if (head && TREE_CODE (head) == BIND_EXPR)
TB_SET_HEAD (TREE_OPERAND (head, 1));
else
TB_WF;
break;
case TB_CHILD_0:
if (head && EXPR_P (head) && TREE_OPERAND (head, 0))
TB_SET_HEAD (TREE_OPERAND (head, 0));
else
TB_WF;
break;
case TB_CHILD_1:
if (head && EXPR_P (head) && TREE_OPERAND (head, 1))
TB_SET_HEAD (TREE_OPERAND (head, 1));
else
TB_WF;
break;
case TB_CHILD_2:
if (head && EXPR_P (head) && TREE_OPERAND (head, 2))
TB_SET_HEAD (TREE_OPERAND (head, 2));
else
TB_WF;
break;
case TB_CHILD_3:
if (head && EXPR_P (head) && TREE_OPERAND (head, 3))
TB_SET_HEAD (TREE_OPERAND (head, 3));
else
TB_WF;
break;
case TB_PRINT:
if (head)
debug_tree (head);
else
TB_WF;
break;
case TB_PRETTY_PRINT:
if (head)
{
print_generic_stmt (TB_OUT_FILE, head, 0);
fprintf (TB_OUT_FILE, "\n");
}
else
TB_WF;
break;
case TB_SEARCH_NAME:
break;
case TB_SEARCH_CODE:
{
enum tree_code code;
char *arg_text;
arg_text = strchr (input, ' ');
if (arg_text == NULL)
{
fprintf (TB_OUT_FILE, "First argument is missing. This isn't a valid search command. \n");
break;
}
code = TB_get_tree_code (arg_text + 1);
/* Search in the subtree a node with the given code. */
{
tree res;
res = walk_tree (&head, find_node_with_code, &code, NULL);
if (res == NULL_TREE)
{
fprintf (TB_OUT_FILE, "There's no node with this code (reachable via the walk_tree function from this node).\n");
}
else
{
fprintf (TB_OUT_FILE, "Achoo! I got this node in the tree.\n");
TB_SET_HEAD (res);
}
}
break;
}
#define TB_MOVE_HEAD(FCT) do { \
if (head) \
{ \
tree t; \
t = FCT (head); \
if (t) \
TB_SET_HEAD (t); \
else \
TB_WF; \
} \
else \
TB_WF; \
} while (0)
case TB_FIRST:
TB_MOVE_HEAD (TB_first_in_bind);
break;
case TB_LAST:
TB_MOVE_HEAD (TB_last_in_bind);
break;
case TB_UP:
TB_MOVE_HEAD (TB_up_expr);
break;
case TB_PREV:
TB_MOVE_HEAD (TB_prev_expr);
break;
case TB_NEXT:
TB_MOVE_HEAD (TB_next_expr);
break;
case TB_HPREV:
/* This command is a little bit special, since it deals with history
stack. For this reason it should keep the "head = ..." statement
and not use TB_MOVE_HEAD. */
if (head)
{
tree t;
t = TB_history_prev ();
if (t)
{
head = t;
if (TB_verbose)
{
print_generic_expr (TB_OUT_FILE, head, 0);
fprintf (TB_OUT_FILE, "\n");
}
}
else
TB_WF;
}
else
TB_WF;
break;
case TB_CHAIN:
/* Don't go further if it's the last node in this chain. */
if (head && TREE_CODE (head) == BLOCK)
TB_SET_HEAD (BLOCK_CHAIN (head));
else if (head && TREE_CHAIN (head))
TB_SET_HEAD (TREE_CHAIN (head));
else
TB_WF;
break;
case TB_FUN:
/* Go up to the current function declaration. */
TB_SET_HEAD (current_function_decl);
fprintf (TB_OUT_FILE, "Current function declaration.\n");
break;
case TB_HELP:
/* Display a help message. */
{
int i;
fprintf (TB_OUT_FILE, "Possible commands are:\n\n");
for (i = 0; i < TB_UNUSED_COMMAND; i++)
{
fprintf (TB_OUT_FILE, "%20s - %s\n", TB_COMMAND_TEXT (i), TB_COMMAND_HELP (i));
}
}
break;
case TB_VERBOSE:
if (TB_verbose == 0)
{
TB_verbose = 1;
fprintf (TB_OUT_FILE, "Verbose on.\n");
}
else
{
TB_verbose = 0;
fprintf (TB_OUT_FILE, "Verbose off.\n");
}
break;
case TB_EXIT:
case TB_QUIT:
/* Just exit from this function. */
goto ret;
default:
TB_NIY;
}
}
ret:;
delete TB_up_ht;
TB_up_ht = NULL;
return;
}
/* Search the first node in this BIND_EXPR. */
static tree
TB_first_in_bind (tree node)
{
tree t;
if (node == NULL_TREE)
return NULL_TREE;
while ((t = TB_prev_expr (node)))
node = t;
return node;
}
/* Search the last node in this BIND_EXPR. */
static tree
TB_last_in_bind (tree node)
{
tree t;
if (node == NULL_TREE)
return NULL_TREE;
while ((t = TB_next_expr (node)))
node = t;
return node;
}
/* Search the parent expression for this node. */
static tree
TB_up_expr (tree node)
{
tree res;
if (node == NULL_TREE)
return NULL_TREE;
res = TB_up_ht->find (node);
return res;
}
/* Search the previous expression in this BIND_EXPR. */
static tree
TB_prev_expr (tree node)
{
node = TB_current_chain_node (node);
if (node == NULL_TREE)
return NULL_TREE;
node = TB_up_expr (node);
if (node && TREE_CODE (node) == COMPOUND_EXPR)
return node;
else
return NULL_TREE;
}
/* Search the next expression in this BIND_EXPR. */
static tree
TB_next_expr (tree node)
{
node = TB_current_chain_node (node);
if (node == NULL_TREE)
return NULL_TREE;
node = TREE_OPERAND (node, 1);
return node;
}
static tree
TB_current_chain_node (tree node)
{
if (node == NULL_TREE)
return NULL_TREE;
if (TREE_CODE (node) == COMPOUND_EXPR)
return node;
node = TB_up_expr (node);
if (node)
{
if (TREE_CODE (node) == COMPOUND_EXPR)
return node;
node = TB_up_expr (node);
if (TREE_CODE (node) == COMPOUND_EXPR)
return node;
}
return NULL_TREE;
}
/* For each node store in its children nodes that the current node is their
parent. This function is used by walk_tree. */
static tree
store_child_info (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
void *data ATTRIBUTE_UNUSED)
{
tree node;
tree_node **slot;
node = *tp;
/* 'node' is the parent of 'TREE_OPERAND (node, *)'. */
if (EXPR_P (node))
{
int n = TREE_OPERAND_LENGTH (node);
int i;
for (i = 0; i < n; i++)
{
tree op = TREE_OPERAND (node, i);
slot = TB_up_ht->find_slot (op, INSERT);
*slot = node;
}
}
/* Never stop walk_tree. */
return NULL_TREE;
}
/* Update information about upper expressions in the hash table. */
static void
TB_update_up (tree node)
{
while (node)
{
walk_tree (&node, store_child_info, NULL, NULL);
/* Walk function's body. */
if (TREE_CODE (node) == FUNCTION_DECL)
if (DECL_SAVED_TREE (node))
walk_tree (&DECL_SAVED_TREE (node), store_child_info, NULL, NULL);
/* Walk rest of the chain. */
node = TREE_CHAIN (node);
}
fprintf (TB_OUT_FILE, "Up/prev expressions updated.\n");
}
/* Parse the input string for determining the command the user asked for. */
static TB_CODE
TB_get_command (char *input)
{
unsigned int mn, size_tok;
int comp;
char *space;
space = strchr (input, ' ');
if (space != NULL)
size_tok = strlen (input) - strlen (space);
else
size_tok = strlen (input) - 1;
for (mn = 0; mn < TB_UNUSED_COMMAND; mn++)
{
if (size_tok != TB_COMMAND_LEN (mn))
continue;
comp = memcmp (input, TB_COMMAND_TEXT (mn), TB_COMMAND_LEN (mn));
if (comp == 0)
/* Here we just determined the command. If this command takes
an argument, then the argument is determined later. */
return TB_COMMAND_CODE (mn);
}
/* Not a valid command. */
return TB_UNUSED_COMMAND;
}
/* Parse the input string for determining the tree code. */
static enum tree_code
TB_get_tree_code (char *input)
{
unsigned int mn, size_tok;
int comp;
char *space;
space = strchr (input, ' ');
if (space != NULL)
size_tok = strlen (input) - strlen (space);
else
size_tok = strlen (input) - 1;
for (mn = 0; mn < LAST_AND_UNUSED_TREE_CODE; mn++)
{
if (size_tok != TB_TREE_CODE_LEN (mn))
continue;
comp = memcmp (input, TB_TREE_CODE_TEXT (mn), TB_TREE_CODE_LEN (mn));
if (comp == 0)
{
fprintf (TB_OUT_FILE, "%s\n", TB_TREE_CODE_TEXT (mn));
return TB_TREE_CODE (mn);
}
}
/* This isn't a valid code. */
return LAST_AND_UNUSED_TREE_CODE;
}
/* Find a node with a given code. This function is used as an argument to
walk_tree. */
static tree
find_node_with_code (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
void *data)
{
enum tree_code *code;
code = (enum tree_code *) data;
if (*code == TREE_CODE (*tp))
return *tp;
return NULL_TREE;
}
/* Returns a pointer to the last visited node. */
static tree
TB_history_prev (void)
{
if (!vec_safe_is_empty (TB_history_stack))
{
tree last = TB_history_stack->last ();
TB_history_stack->pop ();
return last;
}
return NULL_TREE;
}
/* Read up to (and including) a '\n' from STREAM into *LINEPTR
(and null-terminate it). *LINEPTR is a pointer returned from malloc
(or NULL), pointing to *N characters of space. It is realloc'd as
necessary. Returns the number of characters read (not including the
null terminator), or -1 on error or EOF.
This function comes from sed (and is supposed to be a portable version
of getline). */
static long
TB_getline (char **lineptr, long *n, FILE *stream)
{
char *line, *p;
long size, copy;
if (lineptr == NULL || n == NULL)
{
errno = EINVAL;
return -1;
}
if (ferror (stream))
return -1;
/* Make sure we have a line buffer to start with. */
if (*lineptr == NULL || *n < 2) /* !seen and no buf yet need 2 chars. */
{
#ifndef MAX_CANON
#define MAX_CANON 256
#endif
line = (char *) xrealloc (*lineptr, MAX_CANON);
if (line == NULL)
return -1;
*lineptr = line;
*n = MAX_CANON;
}
line = *lineptr;
size = *n;
copy = size;
p = line;
while (1)
{
long len;
while (--copy > 0)
{
register int c = getc (stream);
if (c == EOF)
goto lose;
else if ((*p++ = c) == '\n')
goto win;
}
/* Need to enlarge the line buffer. */
len = p - line;
size *= 2;
line = (char *) xrealloc (line, size);
if (line == NULL)
goto lose;
*lineptr = line;
*n = size;
p = line + len;
copy = size - len;
}
lose:
if (p == *lineptr)
return -1;
/* Return a partial line since we got an error in the middle. */
win:
#if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) || defined(MSDOS)
if (p - 2 >= *lineptr && p[-2] == '\r')
p[-2] = p[-1], --p;
#endif
*p = '\0';
return p - *lineptr;
}
/* Definitions and documentation for the codes used by the Tree Browser.
Copyright (C) 2002-2015 Free Software Foundation, Inc.
Contributed by Sebastian Pop <s.pop@laposte.net>
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/>. */
/* First field in the following declarations is the code of the command
used by the tree browser.
Second field is what is parsed in order to recognize a command.
Third field is used for printing the help message. */
/* Misc. commands. */
DEFTBCODE (TB_EXIT, "x", "Exits tree-browser.")
DEFTBCODE (TB_QUIT, "q", "Exits tree-browser.")
DEFTBCODE (TB_HELP, "h", "Prints this help message.")
DEFTBCODE (TB_UPDATE_UP, "update", "Update information about parent expressions.")
DEFTBCODE (TB_VERBOSE, "verbose", "Sets/unsets verbose mode (default is on).")
/* Walking commands. */
DEFTBCODE (TB_FUN, "fun", "Go to the current function declaration.")
DEFTBCODE (TB_NEXT, "nx", "Go to the next expression in a BIND_EXPR.")
DEFTBCODE (TB_PREV, "pr", "Go to the previous expression in a BIND_EXPR.")
DEFTBCODE (TB_UP, "up", "Go to the parent tree node.")
DEFTBCODE (TB_LAST, "last", "Go to the last expression in a BIND_EXPR.")
DEFTBCODE (TB_FIRST, "first","Go to the first expression in a BIND_EXPR.")
DEFTBCODE (TB_HPREV, "hpr", "Go to the previous visited node (history previous).")
/* Fields accessors. */
DEFTBCODE (TB_CHILD_0, "arg0", "Child 0.")
DEFTBCODE (TB_CHILD_1, "arg1", "Child 1.")
DEFTBCODE (TB_CHILD_2, "arg2", "Child 2.")
DEFTBCODE (TB_CHILD_3, "arg3", "Child 3.")
DEFTBCODE (TB_DECL_SAVED_TREE, "decl_saved_tree", "Body of a function.")
DEFTBCODE (TB_TYPE, "type", "Field accessor.")
DEFTBCODE (TB_SIZE, "size", "Field accessor.")
DEFTBCODE (TB_UNIT_SIZE, "unit_size", "Field accessor.")
DEFTBCODE (TB_OFFSET, "offset", "Field accessor.")
DEFTBCODE (TB_BIT_OFFSET, "bit_offset", "Field accessor.")
DEFTBCODE (TB_CONTEXT, "context", "Field accessor.")
DEFTBCODE (TB_ATTRIBUTES, "attributes", "Field accessor.")
DEFTBCODE (TB_ABSTRACT_ORIGIN, "abstract_origin", "Field accessor.")
DEFTBCODE (TB_ARGUMENTS, "arguments", "Field accessor.")
DEFTBCODE (TB_RESULT, "result", "Field accessor.")
DEFTBCODE (TB_INITIAL, "initial", "Field accessor.")
DEFTBCODE (TB_ARG_TYPE, "arg-type", "Field accessor.")
DEFTBCODE (TB_ARG_TYPE_AS_WRITTEN, "arg-type-as-written", "Field accessor.")
DEFTBCODE (TB_CHAIN, "chain", "Field accessor.")
DEFTBCODE (TB_VALUES, "values", "Field accessor.")
DEFTBCODE (TB_DOMAIN, "domain", "Field accessor.")
DEFTBCODE (TB_METHOD_BASE_TYPE, "method_basetype", "Field accessor.")
DEFTBCODE (TB_FIELDS, "fields", "Field accessor.")
DEFTBCODE (TB_ARG_TYPES, "arg-types", "Field accessor.")
DEFTBCODE (TB_BASETYPE, "basetype", "Field accessor.")
DEFTBCODE (TB_POINTER_TO_THIS, "pointer_to_this", "Field accessor.")
DEFTBCODE (TB_REFERENCE_TO_THIS,"reference_to_this", "Field accessor.")
DEFTBCODE (TB_VARS, "vars", "Field accessor.")
DEFTBCODE (TB_SUPERCONTEXT, "supercontext", "Field accessor.")
DEFTBCODE (TB_BODY, "body", "Field accessor.")
DEFTBCODE (TB_SUBBLOCKS, "subblocks", "Field accessor.")
DEFTBCODE (TB_BLOCK, "block", "Field accessor.")
DEFTBCODE (TB_REAL, "real", "Field accessor.")
DEFTBCODE (TB_IMAG, "imag", "Field accessor.")
DEFTBCODE (TB_PURPOSE, "purpose", "Field accessor.")
DEFTBCODE (TB_VALUE, "value", "Field accessor.")
DEFTBCODE (TB_ELT, "elt", "Field accessor.")
DEFTBCODE (TB_MIN, "min", "Field accessor.")
DEFTBCODE (TB_MAX, "max", "Field accessor.")
/* Searching commands. */
DEFTBCODE (TB_SEARCH_CODE, "sc", "Search a node having a TREE_CODE given as a parameter.")
DEFTBCODE (TB_SEARCH_NAME, "sn", "Search an identifier having a name given as a parameter.")
/* Printing commands. */
DEFTBCODE (TB_PRETTY_PRINT, "pp", "Pretty print current node.")
DEFTBCODE (TB_PRINT, "p", "Prints the current node.")
/*
Local variables:
mode:c
End:
*/
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment