📄 gdbtypes.c
字号:
default: error ("internal error: unhandled type id %d", typeid); break; case FT_VOID: type = init_type (TYPE_CODE_VOID, TARGET_CHAR_BIT / TARGET_CHAR_BIT, 0, "void", objfile); break; case FT_BOOLEAN: type = init_type (TYPE_CODE_INT, TARGET_INT_BIT / TARGET_CHAR_BIT, TYPE_FLAG_UNSIGNED, "boolean", objfile); break; case FT_STRING: type = init_type (TYPE_CODE_PASCAL_ARRAY, TARGET_CHAR_BIT / TARGET_CHAR_BIT, 0, "string", objfile); break; case FT_CHAR: type = init_type (TYPE_CODE_INT, TARGET_CHAR_BIT / TARGET_CHAR_BIT, 0, "char", objfile); break; case FT_SIGNED_CHAR: type = init_type (TYPE_CODE_INT, TARGET_CHAR_BIT / TARGET_CHAR_BIT, TYPE_FLAG_SIGNED, "signed char", objfile); break; case FT_UNSIGNED_CHAR: type = init_type (TYPE_CODE_INT, TARGET_CHAR_BIT / TARGET_CHAR_BIT, TYPE_FLAG_UNSIGNED, "unsigned char", objfile); break; case FT_SHORT: type = init_type (TYPE_CODE_INT, TARGET_SHORT_BIT / TARGET_CHAR_BIT, 0, "short", objfile); break; case FT_SIGNED_SHORT: type = init_type (TYPE_CODE_INT, TARGET_SHORT_BIT / TARGET_CHAR_BIT, TYPE_FLAG_SIGNED, "short", objfile); /* FIXME -fnf */ break; case FT_UNSIGNED_SHORT: type = init_type (TYPE_CODE_INT, TARGET_SHORT_BIT / TARGET_CHAR_BIT, TYPE_FLAG_UNSIGNED, "unsigned short", objfile); break; case FT_INTEGER: type = init_type (TYPE_CODE_INT, TARGET_INT_BIT / TARGET_CHAR_BIT, 0, "int", objfile); break; case FT_SIGNED_INTEGER: type = init_type (TYPE_CODE_INT, TARGET_INT_BIT / TARGET_CHAR_BIT, TYPE_FLAG_SIGNED, "int", objfile); /* FIXME -fnf */ break; case FT_UNSIGNED_INTEGER: type = init_type (TYPE_CODE_INT, TARGET_INT_BIT / TARGET_CHAR_BIT, TYPE_FLAG_UNSIGNED, "unsigned int", objfile); break; case FT_FIXED_DECIMAL: type = init_type (TYPE_CODE_INT, TARGET_INT_BIT / TARGET_CHAR_BIT, 0, "fixed decimal", objfile); break; case FT_LONG: type = init_type (TYPE_CODE_INT, TARGET_LONG_BIT / TARGET_CHAR_BIT, 0, "long", objfile); break; case FT_SIGNED_LONG: type = init_type (TYPE_CODE_INT, TARGET_LONG_BIT / TARGET_CHAR_BIT, TYPE_FLAG_SIGNED, "long", objfile); /* FIXME -fnf */ break; case FT_UNSIGNED_LONG: type = init_type (TYPE_CODE_INT, TARGET_LONG_BIT / TARGET_CHAR_BIT, TYPE_FLAG_UNSIGNED, "unsigned long", objfile); break; case FT_LONG_LONG: type = init_type (TYPE_CODE_INT, TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT, 0, "long long", objfile); break; case FT_SIGNED_LONG_LONG: type = init_type (TYPE_CODE_INT, TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT, TYPE_FLAG_SIGNED, "signed long long", objfile); break; case FT_UNSIGNED_LONG_LONG: type = init_type (TYPE_CODE_INT, TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT, TYPE_FLAG_UNSIGNED, "unsigned long long", objfile); break; case FT_FLOAT: type = init_type (TYPE_CODE_FLT, TARGET_FLOAT_BIT / TARGET_CHAR_BIT, 0, "float", objfile); break; case FT_DBL_PREC_FLOAT: type = init_type (TYPE_CODE_FLT, TARGET_DOUBLE_BIT / TARGET_CHAR_BIT, 0, "double", objfile); break; case FT_FLOAT_DECIMAL: type = init_type (TYPE_CODE_FLT, TARGET_DOUBLE_BIT / TARGET_CHAR_BIT, 0, "floating decimal", objfile); break; case FT_EXT_PREC_FLOAT: type = init_type (TYPE_CODE_FLT, TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT, 0, "long double", objfile); break; case FT_COMPLEX: type = init_type (TYPE_CODE_FLT, TARGET_COMPLEX_BIT / TARGET_CHAR_BIT, 0, "complex", objfile); break; case FT_DBL_PREC_COMPLEX: type = init_type (TYPE_CODE_FLT, TARGET_DOUBLE_COMPLEX_BIT / TARGET_CHAR_BIT, 0, "double complex", objfile); break; case FT_EXT_PREC_COMPLEX: type = init_type (TYPE_CODE_FLT, TARGET_DOUBLE_COMPLEX_BIT / TARGET_CHAR_BIT, 0, "long double complex", objfile); break; } /* Install the newly created type in the objfile's fundamental_types vector. */ *typep = type; } } return (type);}#if MAINTENANCE_CMDSstatic voidprint_bit_vector (bits, nbits) B_TYPE *bits; int nbits;{ int bitno; for (bitno = 0; bitno < nbits; bitno++) { if ((bitno % 8) == 0) { puts_filtered (" "); } if (B_TST (bits, bitno)) { printf_filtered ("1"); } else { printf_filtered ("0"); } }}/* The args list is a strange beast. It is either terminated by a NULL pointer for varargs functions, or by a pointer to a TYPE_CODE_VOID type for normal fixed argcount functions. (FIXME someday) Also note the first arg should be the "this" pointer, we may not want to include it since we may get into a infinitely recursive situation. */static voidprint_arg_types (args, spaces) struct type **args; int spaces;{ if (args != NULL) { while (*args != NULL) { recursive_dump_type (*args, spaces + 2); if ((*args++) -> code == TYPE_CODE_VOID) { break; } } }}static voiddump_fn_fieldlists (type, spaces) struct type *type; int spaces;{ int method_idx; int overload_idx; struct fn_field *f; printfi_filtered (spaces, "fn_fieldlists 0x%x\n", TYPE_FN_FIELDLISTS (type)); for (method_idx = 0; method_idx < TYPE_NFN_FIELDS (type); method_idx++) { f = TYPE_FN_FIELDLIST1 (type, method_idx); printfi_filtered (spaces + 2, "[%d] name '%s' (0x%x) length %d\n", method_idx, TYPE_FN_FIELDLIST_NAME (type, method_idx), TYPE_FN_FIELDLIST_NAME (type, method_idx), TYPE_FN_FIELDLIST_LENGTH (type, method_idx)); for (overload_idx = 0; overload_idx < TYPE_FN_FIELDLIST_LENGTH (type, method_idx); overload_idx++) { printfi_filtered (spaces + 4, "[%d] physname '%s' (0x%x)\n", overload_idx, TYPE_FN_FIELD_PHYSNAME (f, overload_idx), TYPE_FN_FIELD_PHYSNAME (f, overload_idx)); printfi_filtered (spaces + 8, "type 0x%x\n", TYPE_FN_FIELD_TYPE (f, overload_idx)); recursive_dump_type (TYPE_FN_FIELD_TYPE (f, overload_idx), spaces + 8 + 2); printfi_filtered (spaces + 8, "args 0x%x\n", TYPE_FN_FIELD_ARGS (f, overload_idx)); print_arg_types (TYPE_FN_FIELD_ARGS (f, overload_idx), spaces); printfi_filtered (spaces + 8, "fcontext 0x%x\n", TYPE_FN_FIELD_FCONTEXT (f, overload_idx)); printfi_filtered (spaces + 8, "is_const %d\n", TYPE_FN_FIELD_CONST (f, overload_idx)); printfi_filtered (spaces + 8, "is_volatile %d\n", TYPE_FN_FIELD_VOLATILE (f, overload_idx)); printfi_filtered (spaces + 8, "is_private %d\n", TYPE_FN_FIELD_PRIVATE (f, overload_idx)); printfi_filtered (spaces + 8, "is_protected %d\n", TYPE_FN_FIELD_PROTECTED (f, overload_idx)); printfi_filtered (spaces + 8, "is_stub %d\n", TYPE_FN_FIELD_STUB (f, overload_idx)); printfi_filtered (spaces + 8, "voffset %u\n", TYPE_FN_FIELD_VOFFSET (f, overload_idx)); } }}static voidprint_cplus_stuff (type, spaces) struct type *type; int spaces;{ int bitno; printfi_filtered (spaces, "n_baseclasses %d\n", TYPE_N_BASECLASSES (type)); printfi_filtered (spaces, "nfn_fields %d\n", TYPE_NFN_FIELDS (type)); printfi_filtered (spaces, "nfn_fields_total %d\n", TYPE_NFN_FIELDS_TOTAL (type)); if (TYPE_N_BASECLASSES (type) > 0) { printfi_filtered (spaces, "virtual_field_bits (%d bits at *0x%x)", TYPE_N_BASECLASSES (type), TYPE_FIELD_VIRTUAL_BITS (type)); print_bit_vector (TYPE_FIELD_VIRTUAL_BITS (type), TYPE_N_BASECLASSES (type)); puts_filtered ("\n"); } if (TYPE_NFIELDS (type) > 0) { if (TYPE_FIELD_PRIVATE_BITS (type) != NULL) { printfi_filtered (spaces, "private_field_bits (%d bits at *0x%x)", TYPE_NFIELDS (type), TYPE_FIELD_PRIVATE_BITS (type)); print_bit_vector (TYPE_FIELD_PRIVATE_BITS (type), TYPE_NFIELDS (type)); puts_filtered ("\n"); } if (TYPE_FIELD_PROTECTED_BITS (type) != NULL) { printfi_filtered (spaces, "protected_field_bits (%d bits at *0x%x)", TYPE_NFIELDS (type), TYPE_FIELD_PROTECTED_BITS (type)); print_bit_vector (TYPE_FIELD_PROTECTED_BITS (type), TYPE_NFIELDS (type)); puts_filtered ("\n"); } } if (TYPE_NFN_FIELDS (type) > 0) { dump_fn_fieldlists (type, spaces); }}voidrecursive_dump_type (type, spaces) struct type *type; int spaces;{ int idx; printfi_filtered (spaces, "type node 0x%x\n", type); printfi_filtered (spaces, "name '%s' (0x%x)\n", TYPE_NAME (type), TYPE_NAME (type) ? TYPE_NAME (type) : "<NULL>"); printfi_filtered (spaces, "code 0x%x ", TYPE_CODE (type)); switch (TYPE_CODE (type)) { case TYPE_CODE_UNDEF: printf_filtered ("(TYPE_CODE_UNDEF)"); break; case TYPE_CODE_PTR: printf_filtered ("(TYPE_CODE_PTR)"); break; case TYPE_CODE_ARRAY: printf_filtered ("(TYPE_CODE_ARRAY)"); break; case TYPE_CODE_STRUCT: printf_filtered ("(TYPE_CODE_STRUCT)"); break; case TYPE_CODE_UNION: printf_filtered ("(TYPE_CODE_UNION)"); break; case TYPE_CODE_ENUM: printf_filtered ("(TYPE_CODE_ENUM)"); break; case TYPE_CODE_FUNC: printf_filtered ("(TYPE_CODE_FUNC)"); break; case TYPE_CODE_INT: printf_filtered ("(TYPE_CODE_INT)"); break; case TYPE_CODE_FLT: printf_filtered ("(TYPE_CODE_FLT)"); break; case TYPE_CODE_VOID: printf_filtered ("(TYPE_CODE_VOID)"); break; case TYPE_CODE_SET: printf_filtered ("(TYPE_CODE_SET)"); break; case TYPE_CODE_RANGE: printf_filtered ("(TYPE_CODE_RANGE)"); break; case TYPE_CODE_PASCAL_ARRAY: printf_filtered ("(TYPE_CODE_PASCAL_ARRAY)"); break; case TYPE_CODE_ERROR: printf_filtered ("(TYPE_CODE_ERROR)"); break; case TYPE_CODE_MEMBER: printf_filtered ("(TYPE_CODE_MEMBER)"); break; case TYPE_CODE_METHOD: printf_filtered ("(TYPE_CODE_METHOD)"); break; case TYPE_CODE_REF: printf_filtered ("(TYPE_CODE_REF)"); break; case TYPE_CODE_CHAR: printf_filtered ("(TYPE_CODE_CHAR)"); break; case TYPE_CODE_BOOL: printf_filtered ("(TYPE_CODE_BOOL)"); break; default: printf_filtered ("(UNKNOWN TYPE CODE)"); break; } puts_filtered ("\n"); printfi_filtered (spaces, "length %d\n", TYPE_LENGTH (type)); printfi_filtered (spaces, "objfile 0x%x\n", TYPE_OBJFILE (type)); printfi_filtered (spaces, "target_type 0x%x\n", TYPE_TARGET_TYPE (type)); if (TYPE_TARGET_TYPE (type) != NULL) { recursive_dump_type (TYPE_TARGET_TYPE (type), spaces + 2); } printfi_filtered (spaces, "pointer_type 0x%x\n", TYPE_POINTER_TYPE (type)); printfi_filtered (spaces, "reference_type 0x%x\n", TYPE_REFERENCE_TYPE (type)); printfi_filtered (spaces, "function_type 0x%x\n", TYPE_FUNCTION_TYPE (type)); printfi_filtered (spaces, "flags 0x%x", TYPE_FLAGS (type)); if (TYPE_FLAGS (type) & TYPE_FLAG_UNSIGNED) { puts_filtered (" TYPE_FLAG_UNSIGNED"); } if (TYPE_FLAGS (type) & TYPE_FLAG_SIGNED) { puts_filtered (" TYPE_FLAG_SIGNED"); } if (TYPE_FLAGS (type) & TYPE_FLAG_STUB) { puts_filtered (" TYPE_FLAG_STUB"); } puts_filtered ("\n"); printfi_filtered (spaces, "nfields %d 0x%x\n", TYPE_NFIELDS (type), TYPE_FIELDS (type)); for (idx = 0; idx < TYPE_NFIELDS (type); idx++) { printfi_filtered (spaces + 2, "[%d] bitpos %d bitsize %d type 0x%x name '%s' (0x%x)\n", idx, TYPE_FIELD_BITPOS (type, idx), TYPE_FIELD_BITSIZE (type, idx), TYPE_FIELD_TYPE (type, idx), TYPE_FIELD_NAME (type, idx), TYPE_FIELD_NAME (type, idx) != NULL ? TYPE_FIELD_NAME (type, idx) : "<NULL>"); if (TYPE_FIELD_TYPE (type, idx) != NULL) { recursive_dump_type (TYPE_FIELD_TYPE (type, idx), spaces + 4); } } printfi_filtered (spaces, "vptr_basetype 0x%x\n", TYPE_VPTR_BASETYPE (type)); if (TYPE_VPTR_BASETYPE (type) != NULL) { recursive_dump_type (TYPE_VPTR_BASETYPE (type), spaces + 2); } printfi_filtered (spaces, "vptr_fieldno %d\n", TYPE_VPTR_FIELDNO (type)); switch (TYPE_CODE (type)) { case TYPE_CODE_METHOD: case TYPE_CODE_FUNC: printfi_filtered (spaces, "arg_types 0x%x\n", TYPE_ARG_TYPES (type)); print_arg_types (TYPE_ARG_TYPES (type), spaces); break; case TYPE_CODE_STRUCT: printfi_filtered (spaces, "cplus_stuff 0x%x\n", TYPE_CPLUS_SPECIFIC (type)); print_cplus_stuff (type, spaces); break; default: /* We have to pick one of the union types to be able print and test the value. Pick cplus_struct_type, even though we know it isn't any particular one. */ printfi_filtered (spaces, "type_specific 0x%x", TYPE_CPLUS_SPECIFIC (type)); if (TYPE_CPLUS_SPECIFIC (type) != NULL) { printf_filtered (" (unknown data form)"); } printf_filtered ("\n"); break; }}#endif /* MAINTENANCE_CMDS */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -