prdbg.c
来自「基于4个mips核的noc设计」· C语言 代码 · 共 1,863 行 · 第 1/3 页
C
1,863 行
/* prdbg.c -- Print out generic debugging information. Copyright 1995, 1996 Free Software Foundation, Inc. Written by Ian Lance Taylor <ian@cygnus.com>. This file is part of GNU Binutils. This program 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 of the License, or (at your option) any later version. This program 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 this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *//* This file prints out the generic debugging information, by supplying a set of routines to debug_write. */#include <stdio.h>#include <assert.h>#include "bfd.h"#include "bucomm.h"#include "libiberty.h"#include "debug.h"#include "budbg.h"/* This is the structure we use as a handle for these routines. */struct pr_handle{ /* File to print information to. */ FILE *f; /* Current indentation level. */ unsigned int indent; /* Type stack. */ struct pr_stack *stack; /* Parameter number we are about to output. */ int parameter;};/* The type stack. */struct pr_stack{ /* Next element on the stack. */ struct pr_stack *next; /* This element. */ char *type; /* Current visibility of fields if this is a class. */ enum debug_visibility visibility; /* Name of the current method we are handling. */ const char *method;};static void indent PARAMS ((struct pr_handle *));static boolean push_type PARAMS ((struct pr_handle *, const char *));static boolean prepend_type PARAMS ((struct pr_handle *, const char *));static boolean append_type PARAMS ((struct pr_handle *, const char *));static boolean substitute_type PARAMS ((struct pr_handle *, const char *));static boolean indent_type PARAMS ((struct pr_handle *));static char *pop_type PARAMS ((struct pr_handle *));static void print_vma PARAMS ((bfd_vma, char *, boolean, boolean));static boolean pr_fix_visibility PARAMS ((struct pr_handle *, enum debug_visibility));static boolean pr_start_compilation_unit PARAMS ((PTR, const char *));static boolean pr_start_source PARAMS ((PTR, const char *));static boolean pr_empty_type PARAMS ((PTR));static boolean pr_void_type PARAMS ((PTR));static boolean pr_int_type PARAMS ((PTR, unsigned int, boolean));static boolean pr_float_type PARAMS ((PTR, unsigned int));static boolean pr_complex_type PARAMS ((PTR, unsigned int));static boolean pr_bool_type PARAMS ((PTR, unsigned int));static boolean pr_enum_type PARAMS ((PTR, const char *, const char **, bfd_signed_vma *));static boolean pr_pointer_type PARAMS ((PTR));static boolean pr_function_type PARAMS ((PTR, int, boolean));static boolean pr_reference_type PARAMS ((PTR));static boolean pr_range_type PARAMS ((PTR, bfd_signed_vma, bfd_signed_vma));static boolean pr_array_type PARAMS ((PTR, bfd_signed_vma, bfd_signed_vma, boolean));static boolean pr_set_type PARAMS ((PTR, boolean));static boolean pr_offset_type PARAMS ((PTR));static boolean pr_method_type PARAMS ((PTR, boolean, int, boolean));static boolean pr_const_type PARAMS ((PTR));static boolean pr_volatile_type PARAMS ((PTR));static boolean pr_start_struct_type PARAMS ((PTR, const char *, unsigned int, boolean, unsigned int));static boolean pr_struct_field PARAMS ((PTR, const char *, bfd_vma, bfd_vma, enum debug_visibility));static boolean pr_end_struct_type PARAMS ((PTR));static boolean pr_start_class_type PARAMS ((PTR, const char *, unsigned int, boolean, unsigned int, boolean, boolean));static boolean pr_class_static_member PARAMS ((PTR, const char *, const char *, enum debug_visibility));static boolean pr_class_baseclass PARAMS ((PTR, bfd_vma, boolean, enum debug_visibility));static boolean pr_class_start_method PARAMS ((PTR, const char *));static boolean pr_class_method_variant PARAMS ((PTR, const char *, enum debug_visibility, boolean, boolean, bfd_vma, boolean));static boolean pr_class_static_method_variant PARAMS ((PTR, const char *, enum debug_visibility, boolean, boolean));static boolean pr_class_end_method PARAMS ((PTR));static boolean pr_end_class_type PARAMS ((PTR));static boolean pr_typedef_type PARAMS ((PTR, const char *));static boolean pr_tag_type PARAMS ((PTR, const char *, unsigned int, enum debug_type_kind));static boolean pr_typdef PARAMS ((PTR, const char *));static boolean pr_tag PARAMS ((PTR, const char *));static boolean pr_int_constant PARAMS ((PTR, const char *, bfd_vma));static boolean pr_float_constant PARAMS ((PTR, const char *, double));static boolean pr_typed_constant PARAMS ((PTR, const char *, bfd_vma));static boolean pr_variable PARAMS ((PTR, const char *, enum debug_var_kind, bfd_vma));static boolean pr_start_function PARAMS ((PTR, const char *, boolean));static boolean pr_function_parameter PARAMS ((PTR, const char *, enum debug_parm_kind, bfd_vma));static boolean pr_start_block PARAMS ((PTR, bfd_vma));static boolean pr_end_block PARAMS ((PTR, bfd_vma));static boolean pr_end_function PARAMS ((PTR));static boolean pr_lineno PARAMS ((PTR, const char *, unsigned long, bfd_vma));static const struct debug_write_fns pr_fns ={ pr_start_compilation_unit, pr_start_source, pr_empty_type, pr_void_type, pr_int_type, pr_float_type, pr_complex_type, pr_bool_type, pr_enum_type, pr_pointer_type, pr_function_type, pr_reference_type, pr_range_type, pr_array_type, pr_set_type, pr_offset_type, pr_method_type, pr_const_type, pr_volatile_type, pr_start_struct_type, pr_struct_field, pr_end_struct_type, pr_start_class_type, pr_class_static_member, pr_class_baseclass, pr_class_start_method, pr_class_method_variant, pr_class_static_method_variant, pr_class_end_method, pr_end_class_type, pr_typedef_type, pr_tag_type, pr_typdef, pr_tag, pr_int_constant, pr_float_constant, pr_typed_constant, pr_variable, pr_start_function, pr_function_parameter, pr_start_block, pr_end_block, pr_end_function, pr_lineno};/* Print out the generic debugging information recorded in dhandle. */booleanprint_debugging_info (f, dhandle) FILE *f; PTR dhandle;{ struct pr_handle info; info.f = f; info.indent = 0; info.stack = NULL; info.parameter = 0; return debug_write (dhandle, &pr_fns, (PTR) &info);}/* Indent to the current indentation level. */static voidindent (info) struct pr_handle *info;{ unsigned int i; for (i = 0; i < info->indent; i++) putc (' ', info->f);}/* Push a type on the type stack. */static booleanpush_type (info, type) struct pr_handle *info; const char *type;{ struct pr_stack *n; if (type == NULL) return false; n = (struct pr_stack *) xmalloc (sizeof *n); memset (n, 0, sizeof *n); n->type = xstrdup (type); n->visibility = DEBUG_VISIBILITY_IGNORE; n->method = NULL; n->next = info->stack; info->stack = n; return true;}/* Prepend a string onto the type on the top of the type stack. */static booleanprepend_type (info, s) struct pr_handle *info; const char *s;{ char *n; assert (info->stack != NULL); n = (char *) xmalloc (strlen (s) + strlen (info->stack->type) + 1); sprintf (n, "%s%s", s, info->stack->type); free (info->stack->type); info->stack->type = n; return true;}/* Append a string to the type on the top of the type stack. */static booleanappend_type (info, s) struct pr_handle *info; const char *s;{ unsigned int len; if (s == NULL) return false; assert (info->stack != NULL); len = strlen (info->stack->type); info->stack->type = (char *) xrealloc (info->stack->type, len + strlen (s) + 1); strcpy (info->stack->type + len, s); return true;}/* We use an underscore to indicate where the name should go in a type string. This function substitutes a string for the underscore. If there is no underscore, the name follows the type. */static booleansubstitute_type (info, s) struct pr_handle *info; const char *s;{ char *u; assert (info->stack != NULL); u = strchr (info->stack->type, '|'); if (u != NULL) { char *n; n = (char *) xmalloc (strlen (info->stack->type) + strlen (s)); memcpy (n, info->stack->type, u - info->stack->type); strcpy (n + (u - info->stack->type), s); strcat (n, u + 1); free (info->stack->type); info->stack->type = n; return true; } if (strchr (s, '|') != NULL && (strchr (info->stack->type, '{') != NULL || strchr (info->stack->type, '(') != NULL)) { if (! prepend_type (info, "(") || ! append_type (info, ")")) return false; } if (*s == '\0') return true; return (append_type (info, " ") && append_type (info, s));}/* Indent the type at the top of the stack by appending spaces. */static booleanindent_type (info) struct pr_handle *info;{ unsigned int i; for (i = 0; i < info->indent; i++) { if (! append_type (info, " ")) return false; } return true;}/* Pop a type from the type stack. */static char *pop_type (info) struct pr_handle *info;{ struct pr_stack *o; char *ret; assert (info->stack != NULL); o = info->stack; info->stack = o->next; ret = o->type; free (o); return ret;}/* Print a VMA value into a string. */static voidprint_vma (vma, buf, unsignedp, hexp) bfd_vma vma; char *buf; boolean unsignedp; boolean hexp;{ if (sizeof (vma) <= sizeof (unsigned long)) { if (hexp) sprintf (buf, "0x%lx", (unsigned long) vma); else if (unsignedp) sprintf (buf, "%lu", (unsigned long) vma); else sprintf (buf, "%ld", (long) vma); } else { buf[0] = '0'; buf[1] = 'x'; sprintf_vma (buf + 2, vma); }}/* Start a new compilation unit. */static booleanpr_start_compilation_unit (p, filename) PTR p; const char *filename;{ struct pr_handle *info = (struct pr_handle *) p; assert (info->indent == 0); fprintf (info->f, "%s:\n", filename); return true;}/* Start a source file within a compilation unit. */static booleanpr_start_source (p, filename) PTR p; const char *filename;{ struct pr_handle *info = (struct pr_handle *) p; assert (info->indent == 0); fprintf (info->f, " %s:\n", filename); return true;}/* Push an empty type onto the type stack. */static booleanpr_empty_type (p) PTR p;{ struct pr_handle *info = (struct pr_handle *) p; return push_type (info, "<undefined>");}/* Push a void type onto the type stack. */static booleanpr_void_type (p) PTR p;{ struct pr_handle *info = (struct pr_handle *) p; return push_type (info, "void");}/* Push an integer type onto the type stack. */static booleanpr_int_type (p, size, unsignedp) PTR p; unsigned int size; boolean unsignedp;{ struct pr_handle *info = (struct pr_handle *) p; char ab[10]; sprintf (ab, "%sint%d", unsignedp ? "u" : "", size * 8); return push_type (info, ab);}/* Push a floating type onto the type stack. */static booleanpr_float_type (p, size) PTR p; unsigned int size;{ struct pr_handle *info = (struct pr_handle *) p; char ab[10]; if (size == 4) return push_type (info, "float"); else if (size == 8) return push_type (info, "double"); sprintf (ab, "float%d", size * 8); return push_type (info, ab);}/* Push a complex type onto the type stack. */static booleanpr_complex_type (p, size) PTR p; unsigned int size;{ struct pr_handle *info = (struct pr_handle *) p; if (! pr_float_type (p, size)) return false; return prepend_type (info, "complex ");}/* Push a boolean type onto the type stack. */static booleanpr_bool_type (p, size) PTR p; unsigned int size;{ struct pr_handle *info = (struct pr_handle *) p; char ab[10]; sprintf (ab, "bool%d", size * 8); return push_type (info, ab);}/* Push an enum type onto the type stack. */static booleanpr_enum_type (p, tag, names, values) PTR p; const char *tag; const char **names; bfd_signed_vma *values;{ struct pr_handle *info = (struct pr_handle *) p; unsigned int i; bfd_signed_vma val; if (! push_type (info, "enum ")) return false; if (tag != NULL) { if (! append_type (info, tag) || ! append_type (info, " ")) return false; } if (! append_type (info, "{ ")) return false; if (names == NULL) { if (! append_type (info, "/* undefined */")) return false; } else { val = 0; for (i = 0; names[i] != NULL; i++) { if (i > 0) { if (! append_type (info, ", ")) return false; } if (! append_type (info, names[i])) return false; if (values[i] != val) { char ab[20]; print_vma (values[i], ab, false, false); if (! append_type (info, " = ") || ! append_type (info, ab)) return false; val = values[i]; } ++val; } } return append_type (info, " }");}/* Turn the top type on the stack into a pointer. */static booleanpr_pointer_type (p) PTR p;{ struct pr_handle *info = (struct pr_handle *) p; char *s; assert (info->stack != NULL); s = strchr (info->stack->type, '|'); if (s != NULL && s[1] == '[') return substitute_type (info, "(*|)"); return substitute_type (info, "*|");}/* Turn the top type on the stack into a function returning that type. */static booleanpr_function_type (p, argcount, varargs) PTR p; int argcount; boolean varargs;{ struct pr_handle *info = (struct pr_handle *) p; char **arg_types; unsigned int len; char *s; assert (info->stack != NULL); len = 10; if (argcount <= 0) { arg_types = NULL; len += 15; } else { int i; arg_types = (char **) xmalloc (argcount * sizeof *arg_types); for (i = argcount - 1; i >= 0; i--) { if (! substitute_type (info, "")) return false; arg_types[i] = pop_type (info); if (arg_types[i] == NULL) return false; len += strlen (arg_types[i]) + 2; } if (varargs) len += 5; } /* Now the return type is on the top of the stack. */ s = (char *) xmalloc (len); strcpy (s, "(|) (");
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?