prdbg.c
来自「基于4个mips核的noc设计」· C语言 代码 · 共 1,863 行 · 第 1/3 页
C
1,863 行
if (argcount < 0) strcat (s, "/* unknown */"); else { int i; for (i = 0; i < argcount; i++) { if (i > 0) strcat (s, ", "); strcat (s, arg_types[i]); } if (varargs) { if (i > 0) strcat (s, ", "); strcat (s, "..."); } if (argcount > 0) free (arg_types); } strcat (s, ")"); if (! substitute_type (info, s)) return false; free (s); return true;}/* Turn the top type on the stack into a reference to that type. */static booleanpr_reference_type (p) PTR p;{ struct pr_handle *info = (struct pr_handle *) p; assert (info->stack != NULL); return substitute_type (info, "&|");}/* Make a range type. */static booleanpr_range_type (p, lower, upper) PTR p; bfd_signed_vma lower; bfd_signed_vma upper;{ struct pr_handle *info = (struct pr_handle *) p; char abl[20], abu[20]; assert (info->stack != NULL); if (! substitute_type (info, "")) return false; print_vma (lower, abl, false, false); print_vma (upper, abu, false, false); return (prepend_type (info, "range (") && append_type (info, "):") && append_type (info, abl) && append_type (info, ":") && append_type (info, abu));}/* Make an array type. *//*ARGSUSED*/static booleanpr_array_type (p, lower, upper, stringp) PTR p; bfd_signed_vma lower; bfd_signed_vma upper; boolean stringp;{ struct pr_handle *info = (struct pr_handle *) p; char *range_type; char abl[20], abu[20], ab[50]; range_type = pop_type (info); if (range_type == NULL) return false; if (lower == 0) { if (upper == -1) sprintf (ab, "|[]"); else { print_vma (upper + 1, abu, false, false); sprintf (ab, "|[%s]", abu); } } else { print_vma (lower, abl, false, false); print_vma (upper, abu, false, false); sprintf (ab, "|[%s:%s]", abl, abu); } if (! substitute_type (info, ab)) return false; if (strcmp (range_type, "int") != 0) { if (! append_type (info, ":") || ! append_type (info, range_type)) return false; } if (stringp) { if (! append_type (info, " /* string */")) return false; } return true;}/* Make a set type. *//*ARGSUSED*/static booleanpr_set_type (p, bitstringp) PTR p; boolean bitstringp;{ struct pr_handle *info = (struct pr_handle *) p; if (! substitute_type (info, "")) return false; if (! prepend_type (info, "set { ") || ! append_type (info, " }")) return false; if (bitstringp) { if (! append_type (info, "/* bitstring */")) return false; } return true;}/* Make an offset type. */static booleanpr_offset_type (p) PTR p;{ struct pr_handle *info = (struct pr_handle *) p; char *t; if (! substitute_type (info, "")) return false; t = pop_type (info); if (t == NULL) return false; return (substitute_type (info, "") && prepend_type (info, " ") && prepend_type (info, t) && append_type (info, "::|"));}/* Make a method type. */static booleanpr_method_type (p, domain, argcount, varargs) PTR p; boolean domain; int argcount; boolean varargs;{ struct pr_handle *info = (struct pr_handle *) p; unsigned int len; char *domain_type; char **arg_types; char *s; len = 10; if (! domain) domain_type = NULL; else { if (! substitute_type (info, "")) return false; domain_type = pop_type (info); if (domain_type == NULL) return false; if (strncmp (domain_type, "class ", sizeof "class " - 1) == 0 && strchr (domain_type + sizeof "class " - 1, ' ') == NULL) domain_type += sizeof "class " - 1; else if (strncmp (domain_type, "union class ", sizeof "union class ") == 0 && (strchr (domain_type + sizeof "union class " - 1, ' ') == NULL)) domain_type += sizeof "union class " - 1; len += strlen (domain_type); } 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); if (! domain) *s = '\0'; else strcpy (s, domain_type); strcat (s, "::| ("); if (argcount < 0) strcat (s, "/* unknown */"); else { int i; for (i = 0; i < argcount; i++) { if (i > 0) strcat (s, ", "); strcat (s, arg_types[i]); } if (varargs) { if (i > 0) strcat (s, ", "); strcat (s, "..."); } if (argcount > 0) free (arg_types); } strcat (s, ")"); if (! substitute_type (info, s)) return false; free (s); return true;}/* Make a const qualified type. */static booleanpr_const_type (p) PTR p;{ struct pr_handle *info = (struct pr_handle *) p; return substitute_type (info, "const |");}/* Make a volatile qualified type. */static booleanpr_volatile_type (p) PTR p;{ struct pr_handle *info = (struct pr_handle *) p; return substitute_type (info, "volatile |");}/* Start accumulating a struct type. */static booleanpr_start_struct_type (p, tag, id, structp, size) PTR p; const char *tag; unsigned int id; boolean structp; unsigned int size;{ struct pr_handle *info = (struct pr_handle *) p; info->indent += 2; if (! push_type (info, structp ? "struct " : "union ")) return false; if (tag != NULL) { if (! append_type (info, tag)) return false; } else { char idbuf[20]; sprintf (idbuf, "%%anon%u", id); if (! append_type (info, idbuf)) return false; } if (! append_type (info, " {")) return false; if (size != 0 || tag != NULL) { char ab[30]; if (! append_type (info, " /*")) return false; if (size != 0) { sprintf (ab, " size %u", size); if (! append_type (info, ab)) return false; } if (tag != NULL) { sprintf (ab, " id %u", id); if (! append_type (info, ab)) return false; } if (! append_type (info, " */")) return false; } if (! append_type (info, "\n")) return false; info->stack->visibility = DEBUG_VISIBILITY_PUBLIC; return indent_type (info);}/* Output the visibility of a field in a struct. */static booleanpr_fix_visibility (info, visibility) struct pr_handle *info; enum debug_visibility visibility;{ const char *s = NULL; char *t; unsigned int len; assert (info->stack != NULL); if (info->stack->visibility == visibility) return true; assert (info->stack->visibility != DEBUG_VISIBILITY_IGNORE); switch (visibility) { case DEBUG_VISIBILITY_PUBLIC: s = "public"; break; case DEBUG_VISIBILITY_PRIVATE: s = "private"; break; case DEBUG_VISIBILITY_PROTECTED: s = "protected"; break; case DEBUG_VISIBILITY_IGNORE: s = "/* ignore */"; break; default: abort (); return false; } /* Trim off a trailing space in the struct string, to make the output look a bit better, then stick on the visibility string. */ t = info->stack->type; len = strlen (t); assert (t[len - 1] == ' '); t[len - 1] = '\0'; if (! append_type (info, s) || ! append_type (info, ":\n") || ! indent_type (info)) return false; info->stack->visibility = visibility; return true;}/* Add a field to a struct type. */static booleanpr_struct_field (p, name, bitpos, bitsize, visibility) PTR p; const char *name; bfd_vma bitpos; bfd_vma bitsize; enum debug_visibility visibility;{ struct pr_handle *info = (struct pr_handle *) p; char ab[20]; char *t; if (! substitute_type (info, name)) return false; if (! append_type (info, "; /* ")) return false; if (bitsize != 0) { print_vma (bitsize, ab, true, false); if (! append_type (info, "bitsize ") || ! append_type (info, ab) || ! append_type (info, ", ")) return false; } print_vma (bitpos, ab, true, false); if (! append_type (info, "bitpos ") || ! append_type (info, ab) || ! append_type (info, " */\n") || ! indent_type (info)) return false; t = pop_type (info); if (t == NULL) return false; if (! pr_fix_visibility (info, visibility)) return false; return append_type (info, t);}/* Finish a struct type. */static booleanpr_end_struct_type (p) PTR p;{ struct pr_handle *info = (struct pr_handle *) p; char *s; assert (info->stack != NULL); assert (info->indent >= 2); info->indent -= 2; /* Change the trailing indentation to have a close brace. */ s = info->stack->type + strlen (info->stack->type) - 2; assert (s[0] == ' ' && s[1] == ' ' && s[2] == '\0'); *s++ = '}'; *s = '\0'; return true;}/* Start a class type. */static booleanpr_start_class_type (p, tag, id, structp, size, vptr, ownvptr) PTR p; const char *tag; unsigned int id; boolean structp; unsigned int size; boolean vptr; boolean ownvptr;{ struct pr_handle *info = (struct pr_handle *) p; char *tv = NULL; info->indent += 2; if (vptr && ! ownvptr) { tv = pop_type (info); if (tv == NULL) return false; } if (! push_type (info, structp ? "class " : "union class ")) return false; if (tag != NULL) { if (! append_type (info, tag)) return false; } else { char idbuf[20]; sprintf (idbuf, "%%anon%u", id); if (! append_type (info, idbuf)) return false; } if (! append_type (info, " {")) return false; if (size != 0 || vptr || ownvptr || tag != NULL) { if (! append_type (info, " /*")) return false; if (size != 0) { char ab[20]; sprintf (ab, "%u", size); if (! append_type (info, " size ") || ! append_type (info, ab)) return false; } if (vptr) { if (! append_type (info, " vtable ")) return false; if (ownvptr) { if (! append_type (info, "self ")) return false; } else { if (! append_type (info, tv) || ! append_type (info, " ")) return false; } } if (tag != NULL) { char ab[30]; sprintf (ab, " id %u", id); if (! append_type (info, ab)) return false; } if (! append_type (info, " */")) return false; } info->stack->visibility = DEBUG_VISIBILITY_PRIVATE; return (append_type (info, "\n") && indent_type (info));}/* Add a static member to a class. */static booleanpr_class_static_member (p, name, physname, visibility) PTR p; const char *name; const char *physname; enum debug_visibility visibility;{ struct pr_handle *info = (struct pr_handle *) p; char *t; if (! substitute_type (info, name)) return false; if (! prepend_type (info, "static ") || ! append_type (info, "; /* ") || ! append_type (info, physname) || ! append_type (info, " */\n") || ! indent_type (info)) return false; t = pop_type (info); if (t == NULL) return false; if (! pr_fix_visibility (info, visibility)) return false; return append_type (info, t);}/* Add a base class to a class. */static booleanpr_class_baseclass (p, bitpos, virtual, visibility) PTR p; bfd_vma bitpos; boolean virtual; enum debug_visibility visibility;{ struct pr_handle *info = (struct pr_handle *) p; char *t; const char *prefix;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?