|
|
1.1 ! root 1: /* Print values for GNU debugger gdb. ! 2: Copyright (C) 1986 Free Software Foundation, Inc. ! 3: ! 4: GDB is distributed in the hope that it will be useful, but WITHOUT ANY ! 5: WARRANTY. No author or distributor accepts responsibility to anyone ! 6: for the consequences of using it or for whether it serves any ! 7: particular purpose or works at all, unless he says so in writing. ! 8: Refer to the GDB General Public License for full details. ! 9: ! 10: Everyone is granted permission to copy, modify and redistribute GDB, ! 11: but only under the conditions described in the GDB General Public ! 12: License. A copy of this license is supposed to have been given to you ! 13: along with GDB so you can know your rights and responsibilities. It ! 14: should be in a file named COPYING. Among other things, the copyright ! 15: notice and this notice must be preserved on all copies. ! 16: ! 17: In other words, go ahead and share GDB, but don't try to stop ! 18: anyone else from sharing it farther. Help stamp out software hoarding! ! 19: */ ! 20: ! 21: #include <stdio.h> ! 22: #include "defs.h" ! 23: #include "initialize.h" ! 24: #include "symtab.h" ! 25: #include "value.h" ! 26: ! 27: /* Maximum number of chars to print for a string pointer value ! 28: or vector contents. */ ! 29: ! 30: static int print_max; ! 31: ! 32: static void type_print_varspec_suffix (); ! 33: static void type_print_varspec_prefix (); ! 34: static void type_print_base (); ! 35: ! 36: START_FILE ! 37: ! 38: char **unsigned_type_table; ! 39: char **signed_type_table; ! 40: char **float_type_table; ! 41: ! 42: /* Print the value VAL in C-ish syntax on stream STREAM. ! 43: If the object printed is a string pointer, returns ! 44: the number of string bytes printed. */ ! 45: ! 46: value_print (val, stream) ! 47: value val; ! 48: FILE *stream; ! 49: { ! 50: register int i, n, typelen; ! 51: ! 52: /* A "repeated" value really contains several values in a row. ! 53: They are made by the @ operator. ! 54: Print such values as if they were arrays. */ ! 55: ! 56: if (VALUE_REPEATED (val)) ! 57: { ! 58: n = VALUE_REPETITIONS (val); ! 59: typelen = TYPE_LENGTH (VALUE_TYPE (val)); ! 60: fputc ('{', stream); ! 61: /* Print arrays of characters using string syntax. */ ! 62: if (VALUE_TYPE (val) == builtin_type_char ! 63: || VALUE_TYPE (val) == builtin_type_unsigned_char) ! 64: { ! 65: fputc ('"', stream); ! 66: for (i = 0; i < n && i < print_max; i++) ! 67: { ! 68: QUIT; ! 69: printchar (VALUE_CONTENTS (val)[i], stream); ! 70: } ! 71: if (i < n) ! 72: fprintf (stream, "..."); ! 73: fputc ('"', stream); ! 74: } ! 75: else ! 76: { ! 77: for (i = 0; i < n && i < print_max; i++) ! 78: { ! 79: if (i) ! 80: fprintf (stream, ", "); ! 81: val_print (VALUE_TYPE (val), VALUE_CONTENTS (val) + typelen * i, ! 82: VALUE_ADDRESS (val) + typelen * i, stream); ! 83: } ! 84: if (i < n) ! 85: fprintf (stream, "..."); ! 86: } ! 87: fputc ('}', stream); ! 88: } ! 89: else ! 90: { ! 91: /* A simple (nonrepeated) value */ ! 92: /* If it is a pointer, indicate what it points to. */ ! 93: if (TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_PTR) ! 94: { ! 95: fprintf (stream, "("); ! 96: type_print (VALUE_TYPE (val), "", stream, -1); ! 97: fprintf (stream, ") "); ! 98: } ! 99: return val_print (VALUE_TYPE (val), VALUE_CONTENTS (val), ! 100: VALUE_ADDRESS (val), stream); ! 101: } ! 102: } ! 103: ! 104: /* Print on STREAM data stored in debugger at address VALADDR ! 105: according to the format of type TYPE. ! 106: ADDRESS is the location in the inferior that the data ! 107: is supposed to have come from. ! 108: ! 109: If the data are a string pointer, returns the number of ! 110: sting characters printed. */ ! 111: ! 112: int ! 113: val_print (type, valaddr, address, stream) ! 114: struct type *type; ! 115: char *valaddr; ! 116: CORE_ADDR address; ! 117: FILE *stream; ! 118: { ! 119: register int i; ! 120: int len; ! 121: struct type *elttype; ! 122: int eltlen; ! 123: int val; ! 124: unsigned char c; ! 125: ! 126: QUIT; ! 127: ! 128: switch (TYPE_CODE (type)) ! 129: { ! 130: case TYPE_CODE_ARRAY: ! 131: if (TYPE_LENGTH (type) >= 0) ! 132: { ! 133: elttype = TYPE_TARGET_TYPE (type); ! 134: eltlen = TYPE_LENGTH (elttype); ! 135: len = TYPE_LENGTH (type) / eltlen; ! 136: fprintf (stream, "{"); ! 137: /* For an array of chars, print with string syntax. */ ! 138: if (elttype == builtin_type_char ! 139: || elttype == builtin_type_unsigned_char) ! 140: { ! 141: fputc ('"', stream); ! 142: for (i = 0; i < len && i < print_max; i++) ! 143: { ! 144: QUIT; ! 145: printchar (valaddr[i], stream); ! 146: } ! 147: if (i < len) ! 148: fprintf (stream, "..."); ! 149: fputc ('"', stream); ! 150: } ! 151: else ! 152: { ! 153: for (i = 0; i < len && i < print_max; i++) ! 154: { ! 155: if (i) fprintf (stream, ", "); ! 156: val_print (elttype, valaddr + i * eltlen, ! 157: 0, stream); ! 158: } ! 159: if (i < len) ! 160: fprintf (stream, "..."); ! 161: } ! 162: fprintf (stream, "}"); ! 163: break; ! 164: } ! 165: /* Array of unspecified length: treat like pointer. */ ! 166: ! 167: case TYPE_CODE_PTR: ! 168: fprintf (stream, "0x%x", * (int *) valaddr); ! 169: /* For a pointer to char or unsigned char, ! 170: also print the string pointed to, unless pointer is null. */ ! 171: if ((TYPE_TARGET_TYPE (type) == builtin_type_char ! 172: || TYPE_TARGET_TYPE (type) == builtin_type_unsigned_char) ! 173: && unpack_long (type, valaddr) != 0) ! 174: { ! 175: fputc (' ', stream); ! 176: fputc ('"', stream); ! 177: for (i = 0; i < print_max; i++) ! 178: { ! 179: QUIT; ! 180: read_memory (unpack_long (type, valaddr) + i, &c, 1); ! 181: if (c == 0) ! 182: break; ! 183: printchar (c, stream); ! 184: } ! 185: fputc ('"', stream); ! 186: if (i == print_max) ! 187: fprintf (stream, "..."); ! 188: fflush (stream); ! 189: /* Return number of characters printed, plus one for the ! 190: terminating null if we have "reached the end". */ ! 191: return i + (i != print_max); ! 192: } ! 193: break; ! 194: ! 195: case TYPE_CODE_STRUCT: ! 196: case TYPE_CODE_UNION: ! 197: fprintf (stream, "{"); ! 198: len = TYPE_NFIELDS (type); ! 199: for (i = 0; i < len; i++) ! 200: { ! 201: if (i) fprintf (stream, ", "); ! 202: fprintf (stream, "%s = ", TYPE_FIELD_NAME (type, i)); ! 203: if (TYPE_FIELD_PACKED (type, i)) ! 204: { ! 205: val = unpack_field_as_long (type, valaddr, i); ! 206: val_print (TYPE_FIELD_TYPE (type, i), &val, 0, stream); ! 207: } ! 208: else ! 209: val_print (TYPE_FIELD_TYPE (type, i), ! 210: valaddr + TYPE_FIELD_BITPOS (type, i) / 8, ! 211: 0, stream); ! 212: } ! 213: fprintf (stream, "}"); ! 214: break; ! 215: ! 216: case TYPE_CODE_ENUM: ! 217: len = TYPE_NFIELDS (type); ! 218: val = unpack_long (builtin_type_int, valaddr); ! 219: for (i = 0; i < len; i++) ! 220: { ! 221: QUIT; ! 222: if (val == TYPE_FIELD_VALUE (type, i)) ! 223: break; ! 224: } ! 225: if (i < len) ! 226: fprintf (stream, "%s", TYPE_FIELD_NAME (type, i)); ! 227: else ! 228: fprintf (stream, "%d", val); ! 229: break; ! 230: ! 231: case TYPE_CODE_FUNC: ! 232: fprintf (stream, "{"); ! 233: type_print (type, "", stream, -1); ! 234: fprintf (stream, "} "); ! 235: fprintf (stream, "0x%x", address); ! 236: break; ! 237: ! 238: case TYPE_CODE_INT: ! 239: fprintf (stream, ! 240: TYPE_UNSIGNED (type) ? "%u" : "%d", ! 241: unpack_long (type, valaddr)); ! 242: if (type == builtin_type_char ! 243: || type == builtin_type_unsigned_char) ! 244: { ! 245: fprintf (stream, " '"); ! 246: printchar (unpack_long (type, valaddr), stream); ! 247: fputc ('\'', stream); ! 248: } ! 249: break; ! 250: ! 251: case TYPE_CODE_FLT: ! 252: fprintf (stream, "%g", unpack_double (type, valaddr)); ! 253: break; ! 254: ! 255: case TYPE_CODE_VOID: ! 256: fprintf (stream, "void"); ! 257: break; ! 258: ! 259: default: ! 260: error ("Invalid type code in symbol table."); ! 261: } ! 262: fflush (stream); ! 263: } ! 264: ! 265: /* Print a description of a type TYPE ! 266: in the form of a declaration of a variable named VARSTRING. ! 267: Output goes to STREAM (via stdio). ! 268: If SHOW is positive, we show the contents of the outermost level ! 269: of structure even if there is a type name that could be used instead. ! 270: If SHOW is negative, we never show the details of elements' types. */ ! 271: ! 272: type_print (type, varstring, stream, show) ! 273: struct type *type; ! 274: char *varstring; ! 275: FILE *stream; ! 276: int show; ! 277: { ! 278: type_print_1 (type, varstring, stream, show, 0); ! 279: } ! 280: ! 281: /* LEVEL is the depth to indent lines by. */ ! 282: ! 283: type_print_1 (type, varstring, stream, show, level) ! 284: struct type *type; ! 285: char *varstring; ! 286: FILE *stream; ! 287: int show; ! 288: int level; ! 289: { ! 290: register enum type_code code; ! 291: type_print_base (type, stream, show, level); ! 292: code = TYPE_CODE (type); ! 293: if ((varstring && *varstring) ! 294: || ! 295: /* Need a space if going to print stars or brackets; ! 296: but not if we will print just a type name. */ ! 297: ((show > 0 || TYPE_NAME (type) == 0) ! 298: && ! 299: (code == TYPE_CODE_PTR || code == TYPE_CODE_FUNC ! 300: || code == TYPE_CODE_ARRAY))) ! 301: fprintf (stream, " "); ! 302: type_print_varspec_prefix (type, stream, show, 0); ! 303: fprintf (stream, "%s", varstring); ! 304: type_print_varspec_suffix (type, stream, show, 0); ! 305: } ! 306: ! 307: /* Print any asterisks or open-parentheses needed before the ! 308: variable name (to describe its type). ! 309: ! 310: On outermost call, pass 0 for PASSED_A_PTR. ! 311: On outermost call, SHOW > 0 means should ignore ! 312: any typename for TYPE and show its details. ! 313: SHOW is always zero on recursive calls. */ ! 314: ! 315: static void ! 316: type_print_varspec_prefix (type, stream, show, passed_a_ptr) ! 317: struct type *type; ! 318: FILE *stream; ! 319: int show; ! 320: int passed_a_ptr; ! 321: { ! 322: if (TYPE_NAME (type) && show <= 0) ! 323: return; ! 324: ! 325: QUIT; ! 326: ! 327: switch (TYPE_CODE (type)) ! 328: { ! 329: case TYPE_CODE_PTR: ! 330: type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1); ! 331: fputc ('*', stream); ! 332: break; ! 333: ! 334: case TYPE_CODE_FUNC: ! 335: type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, ! 336: passed_a_ptr); ! 337: if (passed_a_ptr) ! 338: fputc ('(', stream); ! 339: break; ! 340: ! 341: case TYPE_CODE_ARRAY: ! 342: type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, ! 343: passed_a_ptr); ! 344: } ! 345: } ! 346: ! 347: /* Print any array sizes, function arguments or close parentheses ! 348: needed after the variable name (to describe its type). ! 349: Args work like type_print_varspec_prefix. */ ! 350: ! 351: static void ! 352: type_print_varspec_suffix (type, stream, show, passed_a_ptr) ! 353: struct type *type; ! 354: FILE *stream; ! 355: int show; ! 356: int passed_a_ptr; ! 357: { ! 358: if (TYPE_NAME (type) && show <= 0) ! 359: return; ! 360: ! 361: QUIT; ! 362: ! 363: switch (TYPE_CODE (type)) ! 364: { ! 365: case TYPE_CODE_ARRAY: ! 366: type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, ! 367: passed_a_ptr); ! 368: fprintf (stream, "["); ! 369: if (TYPE_LENGTH (type) >= 0) ! 370: fprintf (stream, "%d", ! 371: TYPE_LENGTH (type) / TYPE_LENGTH (TYPE_TARGET_TYPE (type))); ! 372: fprintf (stream, "]"); ! 373: break; ! 374: ! 375: case TYPE_CODE_PTR: ! 376: type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 1); ! 377: break; ! 378: ! 379: case TYPE_CODE_FUNC: ! 380: type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, ! 381: passed_a_ptr); ! 382: if (passed_a_ptr) ! 383: fprintf (stream, ")"); ! 384: fprintf (stream, "()"); ! 385: break; ! 386: } ! 387: } ! 388: ! 389: /* Print the name of the type (or the ultimate pointer target, ! 390: function value or array element), or the description of a ! 391: structure or union. ! 392: ! 393: SHOW nonzero means don't print this type as just its name; ! 394: show its real definition even if it has a name. ! 395: SHOW zero means print just typename or struct tag if there is one ! 396: SHOW negative means abbreviate structure elements. ! 397: SHOW is decremented for printing of structure elements. ! 398: ! 399: LEVEL is the depth to indent by. ! 400: We increase it for some recursive calls. */ ! 401: ! 402: static void ! 403: type_print_base (type, stream, show, level) ! 404: struct type *type; ! 405: FILE *stream; ! 406: int show; ! 407: int level; ! 408: { ! 409: char *name; ! 410: register int i; ! 411: register int len; ! 412: register int lastval; ! 413: ! 414: QUIT; ! 415: ! 416: if (TYPE_NAME (type) && show <= 0) ! 417: { ! 418: fprintf (stream, TYPE_NAME (type)); ! 419: return; ! 420: } ! 421: ! 422: switch (TYPE_CODE (type)) ! 423: { ! 424: case TYPE_CODE_ARRAY: ! 425: case TYPE_CODE_PTR: ! 426: case TYPE_CODE_FUNC: ! 427: type_print_base (TYPE_TARGET_TYPE (type), stream, show, level); ! 428: break; ! 429: ! 430: case TYPE_CODE_STRUCT: ! 431: fprintf (stream, "struct "); ! 432: goto struct_union; ! 433: ! 434: case TYPE_CODE_UNION: ! 435: fprintf (stream, "union "); ! 436: struct_union: ! 437: if (TYPE_NAME (type) && (name = TYPE_NAME (type))) ! 438: { ! 439: while (*name != ' ') name++; ! 440: fprintf (stream, "%s ", name + 1); ! 441: } ! 442: if (show < 0) ! 443: fprintf (stream, "{...}"); ! 444: else ! 445: { ! 446: fprintf (stream, "{"); ! 447: len = TYPE_NFIELDS (type); ! 448: fprintf (stream, "\n"); ! 449: for (i = 0; i < len; i++) ! 450: { ! 451: QUIT; ! 452: print_spaces (level + 4, stream); ! 453: type_print_1 (TYPE_FIELD_TYPE (type, i), ! 454: TYPE_FIELD_NAME (type, i), ! 455: stream, show - 1, level + 4); ! 456: if (TYPE_FIELD_PACKED (type, i)) ! 457: { ! 458: /* ??? don't know what to put here ??? */; ! 459: } ! 460: fprintf (stream, ";\n"); ! 461: } ! 462: print_spaces (level, stream); ! 463: fputc ('}', stream); ! 464: } ! 465: break; ! 466: ! 467: case TYPE_CODE_ENUM: ! 468: fprintf (stream, "enum "); ! 469: if (TYPE_NAME (type)) ! 470: { ! 471: name = TYPE_NAME (type); ! 472: while (*name != ' ') name++; ! 473: fprintf (stream, "%s ", name + 1); ! 474: } ! 475: if (show < 0) ! 476: fprintf (stream, "{...}"); ! 477: else ! 478: { ! 479: fprintf (stream, "{"); ! 480: len = TYPE_NFIELDS (type); ! 481: lastval = 0; ! 482: for (i = 0; i < len; i++) ! 483: { ! 484: QUIT; ! 485: if (i) fprintf (stream, ", "); ! 486: fprintf (stream, "%s", TYPE_FIELD_NAME (type, i)); ! 487: if (lastval != TYPE_FIELD_VALUE (type, i)) ! 488: { ! 489: fprintf (stream, " : %d", TYPE_FIELD_VALUE (type, i)); ! 490: lastval = TYPE_FIELD_VALUE (type, i); ! 491: } ! 492: lastval++; ! 493: } ! 494: fprintf (stream, "}"); ! 495: } ! 496: break; ! 497: ! 498: case TYPE_CODE_INT: ! 499: if (TYPE_UNSIGNED (type)) ! 500: name = unsigned_type_table[TYPE_LENGTH (type)]; ! 501: else ! 502: name = signed_type_table[TYPE_LENGTH (type)]; ! 503: fprintf (stream, "%s", name); ! 504: break; ! 505: ! 506: case TYPE_CODE_FLT: ! 507: name = float_type_table[TYPE_LENGTH (type)]; ! 508: fprintf (stream, "%s", name); ! 509: break; ! 510: ! 511: case TYPE_CODE_VOID: ! 512: fprintf (stream, "void"); ! 513: break; ! 514: ! 515: case 0: ! 516: fprintf (stream, "struct unknown"); ! 517: break; ! 518: ! 519: default: ! 520: error ("Invalid type code in symbol table."); ! 521: } ! 522: } ! 523: ! 524: static void ! 525: set_maximum_command (arg) ! 526: char *arg; ! 527: { ! 528: if (!arg) error_no_arg ("value for maximum elements to print"); ! 529: print_max = atoi (arg); ! 530: } ! 531: ! 532: static ! 533: initialize () ! 534: { ! 535: add_com ("set-maximum", class_vars, set_maximum_command, ! 536: "Set NUMBER as limit on string chars or array elements to print."); ! 537: ! 538: print_max = 200; ! 539: ! 540: unsigned_type_table ! 541: = (char **) xmalloc ((1 + sizeof (unsigned long)) * sizeof (char *)); ! 542: bzero (unsigned_type_table, (1 + sizeof (unsigned long))); ! 543: unsigned_type_table[sizeof (unsigned char)] = "unsigned char"; ! 544: unsigned_type_table[sizeof (unsigned short)] = "unsigned short"; ! 545: unsigned_type_table[sizeof (unsigned long)] = "unsigned long"; ! 546: unsigned_type_table[sizeof (unsigned int)] = "unsigned int"; ! 547: ! 548: signed_type_table ! 549: = (char **) xmalloc ((1 + sizeof (long)) * sizeof (char *)); ! 550: bzero (signed_type_table, (1 + sizeof (long))); ! 551: signed_type_table[sizeof (char)] = "char"; ! 552: signed_type_table[sizeof (short)] = "short"; ! 553: signed_type_table[sizeof (long)] = "long"; ! 554: signed_type_table[sizeof (int)] = "int"; ! 555: ! 556: float_type_table ! 557: = (char **) xmalloc ((1 + sizeof (double)) * sizeof (char *)); ! 558: bzero (float_type_table, (1 + sizeof (double))); ! 559: float_type_table[sizeof (float)] = "float"; ! 560: float_type_table[sizeof (double)] = "double"; ! 561: } ! 562: ! 563: END_FILE
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.