aboutsummaryrefslogtreecommitdiff
path: root/gcc/objc/objc-dmp-tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/objc/objc-dmp-tree.c')
-rw-r--r--gcc/objc/objc-dmp-tree.c285
1 files changed, 285 insertions, 0 deletions
diff --git a/gcc/objc/objc-dmp-tree.c b/gcc/objc/objc-dmp-tree.c
new file mode 100644
index 00000000000..14d9dabfca1
--- /dev/null
+++ b/gcc/objc/objc-dmp-tree.c
@@ -0,0 +1,285 @@
+/* APPLE LOCAL file new tree dump */
+/* Common condensed tree display routines specific for objc and objc++.
+ Copyright (C) 2001 Free Software Foundation, Inc.
+ Contributed by Ira L. Ruben (ira@apple.com)
+
+This file is part of GNU CC.
+
+GNU CC 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 2, or (at your option)
+any later version.
+
+GNU CC 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 GNU CC; see the file COPYING. If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* The Objective-C++ and Objective-C tree dump handling is piggybacked
+ on either C++ or C tree dump handling. */
+
+#ifdef OBJCPLUS
+#include "cp-dmp-tree.c"
+#else
+#include "c-dmp-tree.c"
+#endif
+
+#include "objc-act.h"
+
+int objc_dump_tree_p (FILE *, const char *, tree, int);
+lang_dump_tree_p_t objc_prev_lang_dump_tree_p = NULL;
+
+#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) \
+static void print_ ## SYM (FILE *file, const char *annotation, tree node, int indent);
+#include "objc-tree.def"
+#undef DEFTREECODE
+
+/*-------------------------------------------------------------------*/
+
+static void
+print_CLASS_INTERFACE_TYPE (file, annotation, node, indent)
+ FILE *file ATTRIBUTE_UNUSED;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node ATTRIBUTE_UNUSED;
+ int indent ATTRIBUTE_UNUSED;
+{
+ tree n;
+
+ if (CLASS_SUPER_NAME (node))
+ fprintf (file, " super-name=%s",
+ IDENTIFIER_POINTER (CLASS_SUPER_NAME (node)));
+ /* The ivars for the class are accessible either via
+ CLASS_IVARS(node), or as fields of the
+ underlying C struct (itself accessible via
+ CLASS_STATIC_TEMPLATE(node). */
+ fprintf (file, " ivars=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (CLASS_IVARS (node)));
+ /* zlaski 2001-Jul-26: not sure what the raw ivars are for... */
+ fprintf (file, " raw_ivars=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (CLASS_RAW_IVARS (node)));
+ /* The "own ivars" list contains just the ivars defined by this
+ class (i.e., not inherited). */
+ fprintf (file, " own_ivars=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (CLASS_OWN_IVARS (node)));
+
+ print_type (file, annotation, node, indent);
+ (void)node_seen (node, TRUE);
+
+ /* print out names of protocols, categories. */
+ for (n = CLASS_PROTOCOL_LIST (node); n; n = TREE_CHAIN (n))
+ print_type (file, NULL, TREE_VALUE (n), indent + INDENT);
+ for (n = CLASS_CATEGORY_LIST (node); n; n = TREE_CHAIN (n))
+ print_type (file, NULL, TREE_VALUE (n), indent + INDENT);
+
+ /* Print the underlying RECORD_TYPE node, with fields. */
+ dump_tree (file, annotation, CLASS_STATIC_TEMPLATE (node),
+ indent + INDENT);
+ /* Print out names of class and instance methods. */
+ for (n = CLASS_CLS_METHODS (node); n; n = TREE_CHAIN (n))
+ dump_tree (file, NULL, n, indent + INDENT);
+ for (n = CLASS_NST_METHODS (node); n; n = TREE_CHAIN (n))
+ dump_tree (file, NULL, n, indent + INDENT);
+}
+
+static void
+print_CLASS_IMPLEMENTATION_TYPE (file, annotation, node, indent)
+ FILE *file ATTRIBUTE_UNUSED;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node ATTRIBUTE_UNUSED;
+ int indent ATTRIBUTE_UNUSED;
+{
+ print_CLASS_INTERFACE_TYPE (file, annotation, node, indent);
+}
+
+static void
+print_CATEGORY_INTERFACE_TYPE (file, annotation, node, indent)
+ FILE *file ATTRIBUTE_UNUSED;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node ATTRIBUTE_UNUSED;
+ int indent ATTRIBUTE_UNUSED;
+{
+ tree n;
+
+ fprintf (file, " cat-name=%s",
+ IDENTIFIER_POINTER (CLASS_SUPER_NAME (node)));
+ print_type (file, annotation, node, indent);
+ (void)node_seen (node, TRUE);
+
+ for (n = CLASS_PROTOCOL_LIST (node); n; n = TREE_CHAIN (n))
+ dump_tree (file, NULL, TREE_VALUE (n), indent + INDENT);
+ /* Print out names of class and instance methods. */
+ for (n = CLASS_CLS_METHODS (node); n; n = TREE_CHAIN (n))
+ dump_tree (file, NULL, n, indent + INDENT);
+ for (n = CLASS_NST_METHODS (node); n; n = TREE_CHAIN (n))
+ dump_tree (file, NULL, n, indent + INDENT);
+}
+
+static void
+print_CATEGORY_IMPLEMENTATION_TYPE (file, annotation, node, indent)
+ FILE *file ATTRIBUTE_UNUSED;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node ATTRIBUTE_UNUSED;
+ int indent ATTRIBUTE_UNUSED;
+{
+ print_CATEGORY_INTERFACE_TYPE (file, annotation, node, indent);
+}
+
+static void
+print_PROTOCOL_INTERFACE_TYPE (file, annotation, node, indent)
+ FILE *file ATTRIBUTE_UNUSED;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node ATTRIBUTE_UNUSED;
+ int indent ATTRIBUTE_UNUSED;
+{
+ tree n;
+
+ fprintf (file, " fwd-decl=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (PROTOCOL_FORWARD_DECL (node)));
+ fprintf (file, " defined=%d", PROTOCOL_DEFINED (node));
+
+ print_type (file, annotation, node, indent);
+ (void)node_seen (node, TRUE);
+
+ /* print superprotocols, if any. */
+ for (n = PROTOCOL_LIST (node); n; n = TREE_CHAIN (n))
+ dump_tree (file, NULL, TREE_VALUE (n), indent + INDENT);
+
+ /* Print out names of class and instance methods. */
+ for (n = PROTOCOL_CLS_METHODS (node); n; n = TREE_CHAIN (n))
+ dump_tree (file, NULL, n, indent + INDENT);
+ for (n = PROTOCOL_NST_METHODS (node); n; n = TREE_CHAIN (n))
+ dump_tree (file, NULL, n, indent + INDENT);
+}
+
+static void
+print_KEYWORD_DECL (file, annotation, node, indent)
+ FILE *file ATTRIBUTE_UNUSED;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node ATTRIBUTE_UNUSED;
+ int indent ATTRIBUTE_UNUSED;
+{
+ fprintf (file, " key=%s",
+ IDENTIFIER_POINTER (KEYWORD_KEY_NAME (node)));
+ fprintf (file, " arg=%s",
+ IDENTIFIER_POINTER (KEYWORD_ARG_NAME (node)));
+
+ print_type (file, annotation, node, indent);
+ (void)node_seen (node, TRUE);
+}
+
+static void
+print_INSTANCE_METHOD_DECL (file, annotation, node, indent)
+ FILE *file ATTRIBUTE_UNUSED;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node ATTRIBUTE_UNUSED;
+ int indent ATTRIBUTE_UNUSED;
+{
+ fprintf (file, " args=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (METHOD_SEL_ARGS (node)));
+ fprintf (file, " addl=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (METHOD_ADD_ARGS (node)));
+ if (METHOD_ENCODING (node))
+ fprintf (file, " encode=%s",
+ IDENTIFIER_POINTER (METHOD_ENCODING (node)));
+
+ print_decl (file, annotation, node, indent);
+
+ /* Print the underlying FUNCTION_DECL node. */
+ if (METHOD_DEFINITION (node))
+ dump_tree (file, annotation, METHOD_DEFINITION (node),
+ indent + INDENT);
+
+ (void)node_seen (node, TRUE);
+}
+
+static void
+print_CLASS_METHOD_DECL (file, annotation, node, indent)
+ FILE *file ATTRIBUTE_UNUSED;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node ATTRIBUTE_UNUSED;
+ int indent ATTRIBUTE_UNUSED;
+{
+ print_INSTANCE_METHOD_DECL (file, annotation, node, indent);
+}
+
+static void
+print_CLASS_REFERENCE_EXPR (file, annotation, node, indent)
+ FILE *file ATTRIBUTE_UNUSED;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node ATTRIBUTE_UNUSED;
+ int indent ATTRIBUTE_UNUSED;
+{
+ fprintf (file, " ident=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TREE_OPERAND (node, 0)));
+ (void)node_seen (node, TRUE);
+}
+
+static void
+print_MESSAGE_SEND_EXPR (file, annotation, node, indent)
+ FILE *file ATTRIBUTE_UNUSED;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node ATTRIBUTE_UNUSED;
+ int indent ATTRIBUTE_UNUSED;
+{
+ fprintf (file, " receiver=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TREE_OPERAND (node, 0)));
+ fprintf (file, " sel_name=%s",
+ IDENTIFIER_POINTER (TREE_OPERAND (node, 1)));
+ fprintf (file, " args=");
+ fprintf (file, HOST_PTR_PRINTF,
+ HOST_PTR_PRINTF_VALUE (TREE_OPERAND (node, 2)));
+ (void)node_seen (node, TRUE);
+}
+
+/*-------------------------------------------------------------------*/
+
+int
+objc_dump_tree_p (file, annotation, node, indent)
+ FILE *file;
+ const char *annotation ATTRIBUTE_UNUSED;
+ tree node;
+ int indent;
+{
+ switch (TREE_CODE (node))
+ {
+#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) \
+ case SYM: print_ ## SYM (file, annotation, node, indent); break;
+#include "objc-tree.def"
+#undef DEFTREECODE
+ default:
+ return objc_prev_lang_dump_tree_p (file, annotation, node, indent);
+ }
+
+ return 1;
+}
+
+
+/*-------------------------------------------------------------------*/
+
+#if 0
+
+cd $gcc3/gcc; \
+cc -no-cpp-precomp -c -DIN_GCC -g \
+ -W -Wall -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wtraditional -pedantic -Wno-long-long \
+ -DHAVE_CONFIG_H \
+ -I$gcc3obj \
+ -I. \
+ -Iobjc \
+ -Iconfig \
+ -I../include \
+ objc/objc-dmp-tree.c -o ~/tmp.o -w
+
+#endif