|
|
1.1 ! root 1: /* Low level packing and unpacking of values for GDB. ! 2: Copyright (C) 1986, 1987 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 "param.h" ! 25: #include "symtab.h" ! 26: #include "value.h" ! 27: ! 28: /* The value-history records all the values printed ! 29: by print commands during this session. Each chunk ! 30: records 60 consecutive values. The first chunk on ! 31: the chain records the most recent values. ! 32: The total number of values is in value_history_count. */ ! 33: ! 34: #define VALUE_HISTORY_CHUNK 60 ! 35: ! 36: struct value_history_chunk ! 37: { ! 38: struct value_history_chunk *next; ! 39: value values[VALUE_HISTORY_CHUNK]; ! 40: }; ! 41: ! 42: /* Chain of chunks now in use. */ ! 43: ! 44: static struct value_history_chunk *value_history_chain; ! 45: ! 46: static int value_history_count; /* Abs number of last entry stored */ ! 47: ! 48: START_FILE ! 49: ! 50: /* List of all value objects currently allocated ! 51: (except for those released by calls to release_value) ! 52: This is so they can be freed after each command. */ ! 53: ! 54: static value all_values; ! 55: ! 56: /* Allocate a value that has the correct length for type TYPE. */ ! 57: ! 58: value ! 59: allocate_value (type) ! 60: struct type *type; ! 61: { ! 62: register value val; ! 63: ! 64: val = (value) xmalloc (sizeof (struct value) + TYPE_LENGTH (type)); ! 65: VALUE_NEXT (val) = all_values; ! 66: all_values = val; ! 67: VALUE_TYPE (val) = type; ! 68: VALUE_LVAL (val) = not_lval; ! 69: VALUE_ADDRESS (val) = 0; ! 70: VALUE_OFFSET (val) = 0; ! 71: VALUE_BITPOS (val) = 0; ! 72: VALUE_BITSIZE (val) = 0; ! 73: VALUE_REPEATED (val) = 0; ! 74: VALUE_REPETITIONS (val) = 0; ! 75: VALUE_REGNO (val) = -1; ! 76: return val; ! 77: } ! 78: ! 79: /* Allocate a value that has the correct length ! 80: for COUNT repetitions type TYPE. */ ! 81: ! 82: value ! 83: allocate_repeat_value (type, count) ! 84: struct type *type; ! 85: int count; ! 86: { ! 87: register value val; ! 88: ! 89: val = (value) xmalloc (sizeof (struct value) + TYPE_LENGTH (type) * count); ! 90: VALUE_NEXT (val) = all_values; ! 91: all_values = val; ! 92: VALUE_TYPE (val) = type; ! 93: VALUE_LVAL (val) = not_lval; ! 94: VALUE_ADDRESS (val) = 0; ! 95: VALUE_OFFSET (val) = 0; ! 96: VALUE_BITPOS (val) = 0; ! 97: VALUE_BITSIZE (val) = 0; ! 98: VALUE_REPEATED (val) = 1; ! 99: VALUE_REPETITIONS (val) = count; ! 100: VALUE_REGNO (val) = -1; ! 101: return val; ! 102: } ! 103: ! 104: /* Free all the values that have been allocated (except for those released). ! 105: Called after each command, successful or not. */ ! 106: ! 107: void ! 108: free_all_values () ! 109: { ! 110: register value val, next; ! 111: ! 112: for (val = all_values; val; val = next) ! 113: { ! 114: next = VALUE_NEXT (val); ! 115: free (val); ! 116: } ! 117: ! 118: all_values = 0; ! 119: } ! 120: ! 121: /* Remove VAL from the chain all_values ! 122: so it will not be freed automatically. */ ! 123: ! 124: void ! 125: release_value (val) ! 126: register value val; ! 127: { ! 128: register value v; ! 129: ! 130: if (all_values == val) ! 131: { ! 132: all_values = val->next; ! 133: return; ! 134: } ! 135: ! 136: for (v = all_values; v; v = v->next) ! 137: { ! 138: if (v->next == val) ! 139: { ! 140: v->next = val->next; ! 141: break; ! 142: } ! 143: } ! 144: } ! 145: ! 146: /* Return a copy of the value ARG. ! 147: It contains the same contents, for same memory address, ! 148: but it's a different block of storage. */ ! 149: ! 150: static value ! 151: value_copy (arg) ! 152: value arg; ! 153: { ! 154: register value val; ! 155: register struct type *type = VALUE_TYPE (arg); ! 156: if (VALUE_REPEATED (arg)) ! 157: val = allocate_repeat_value (type, VALUE_REPETITIONS (arg)); ! 158: else ! 159: val = allocate_value (type); ! 160: VALUE_LVAL (val) = VALUE_LVAL (arg); ! 161: VALUE_ADDRESS (val) = VALUE_ADDRESS (arg); ! 162: VALUE_OFFSET (val) = VALUE_OFFSET (arg); ! 163: VALUE_BITPOS (val) = VALUE_BITPOS (arg); ! 164: VALUE_BITSIZE (val) = VALUE_BITSIZE (arg); ! 165: VALUE_REGNO (val) = VALUE_REGNO (arg); ! 166: bcopy (VALUE_CONTENTS (arg), VALUE_CONTENTS (val), ! 167: TYPE_LENGTH (VALUE_TYPE (arg)) ! 168: * (VALUE_REPEATED (arg) ? VALUE_REPETITIONS (arg) : 1)); ! 169: return val; ! 170: } ! 171: ! 172: /* Access to the value history. */ ! 173: ! 174: /* Record a new value in the value history. ! 175: Returns the absolute history index of the entry. */ ! 176: ! 177: int ! 178: record_latest_value (val) ! 179: value val; ! 180: { ! 181: register int i; ! 182: ! 183: /* Get error now if about to store an invalid float. */ ! 184: if (TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_FLT) ! 185: value_as_double (val); ! 186: ! 187: /* Here we treat value_history_count as origin-zero ! 188: and applying to the value being stored now. */ ! 189: ! 190: i = value_history_count % VALUE_HISTORY_CHUNK; ! 191: if (i == 0) ! 192: { ! 193: register struct value_history_chunk *new ! 194: = (struct value_history_chunk *) xmalloc (sizeof (struct value_history_chunk)); ! 195: bzero (new->values, sizeof new->values); ! 196: new->next = value_history_chain; ! 197: value_history_chain = new; ! 198: } ! 199: ! 200: value_history_chain->values[i] = val; ! 201: release_value (val); ! 202: ! 203: /* Now we regard value_history_count as origin-one ! 204: and applying to the value just stored. */ ! 205: ! 206: return ++value_history_count; ! 207: } ! 208: ! 209: /* Return a copy of the value in the history with sequence number NUM. */ ! 210: ! 211: value ! 212: access_value_history (num) ! 213: int num; ! 214: { ! 215: register struct value_history_chunk *chunk; ! 216: register int i; ! 217: register int absnum = num; ! 218: ! 219: if (absnum <= 0) ! 220: absnum += value_history_count; ! 221: ! 222: if (absnum <= 0) ! 223: { ! 224: if (num == 0) ! 225: error ("The history is empty."); ! 226: else if (num == 1) ! 227: error ("There is only one value in the history."); ! 228: else ! 229: error ("History does not go back to $$%d.", -num); ! 230: } ! 231: if (absnum > value_history_count) ! 232: error ("History has not yet reached $%d.", absnum); ! 233: ! 234: absnum--; ! 235: ! 236: /* Now absnum is always absolute and origin zero. */ ! 237: ! 238: chunk = value_history_chain; ! 239: for (i = (value_history_count - 1) / VALUE_HISTORY_CHUNK - absnum / VALUE_HISTORY_CHUNK; ! 240: i > 0; i--) ! 241: chunk = chunk->next; ! 242: ! 243: return value_copy (chunk->values[absnum % VALUE_HISTORY_CHUNK]); ! 244: } ! 245: ! 246: /* Clear the value history entirely. ! 247: Must be done when new symbol tables are loaded, ! 248: because the type pointers become invalid. */ ! 249: ! 250: void ! 251: clear_value_history () ! 252: { ! 253: register struct value_history_chunk *next; ! 254: register int i; ! 255: register value val; ! 256: ! 257: while (value_history_chain) ! 258: { ! 259: for (i = 0; i < VALUE_HISTORY_CHUNK; i++) ! 260: if (val = value_history_chain->values[i]) ! 261: free (val); ! 262: next = value_history_chain->next; ! 263: free (value_history_chain); ! 264: value_history_chain = next; ! 265: } ! 266: value_history_count = 0; ! 267: } ! 268: ! 269: static void ! 270: history_info (num_exp) ! 271: char *num_exp; ! 272: { ! 273: register int i; ! 274: register value val; ! 275: register int num; ! 276: ! 277: if (num_exp) ! 278: num = parse_and_eval_address (num_exp) - 5; ! 279: else ! 280: num = value_history_count - 9; ! 281: ! 282: if (num <= 0) ! 283: num = 1; ! 284: ! 285: for (i = num; i < num + 10 && i <= value_history_count; i++) ! 286: { ! 287: val = access_value_history (i); ! 288: printf ("$%d = ", i); ! 289: value_print (val, stdout, 0); ! 290: printf ("\n"); ! 291: } ! 292: } ! 293: ! 294: /* Internal variables. These are variables within the debugger ! 295: that hold values assigned by debugger commands. ! 296: The user refers to them with a '$' prefix ! 297: that does not appear in the variable names stored internally. */ ! 298: ! 299: static struct internalvar *internalvars; ! 300: ! 301: /* Look up an internal variable with name NAME. NAME should not ! 302: normally include a dollar sign. ! 303: ! 304: If the specified internal variable does not exist, ! 305: one is created, with a void value. */ ! 306: ! 307: struct internalvar * ! 308: lookup_internalvar (name) ! 309: char *name; ! 310: { ! 311: register struct internalvar *var; ! 312: ! 313: for (var = internalvars; var; var = var->next) ! 314: if (!strcmp (var->name, name)) ! 315: return var; ! 316: ! 317: var = (struct internalvar *) xmalloc (sizeof (struct internalvar)); ! 318: var->name = concat (name, "", ""); ! 319: var->value = allocate_value (builtin_type_void); ! 320: release_value (var->value); ! 321: var->next = internalvars; ! 322: internalvars = var; ! 323: return var; ! 324: } ! 325: ! 326: value ! 327: value_of_internalvar (var) ! 328: struct internalvar *var; ! 329: { ! 330: register value val = value_copy (var->value); ! 331: VALUE_LVAL (val) = lval_internalvar; ! 332: VALUE_INTERNALVAR (val) = var; ! 333: return val; ! 334: } ! 335: ! 336: void ! 337: set_internalvar_component (var, offset, bitpos, bitsize, newval) ! 338: struct internalvar *var; ! 339: int offset, bitpos, bitsize; ! 340: value newval; ! 341: { ! 342: register char *addr = VALUE_CONTENTS (var->value) + offset; ! 343: if (bitsize) ! 344: modify_field (addr, value_as_long (newval), ! 345: bitpos, bitsize); ! 346: else ! 347: bcopy (VALUE_CONTENTS (newval), addr, ! 348: TYPE_LENGTH (VALUE_TYPE (newval))); ! 349: } ! 350: ! 351: void ! 352: set_internalvar (var, val) ! 353: struct internalvar *var; ! 354: value val; ! 355: { ! 356: free (var->value); ! 357: var->value = value_copy (val); ! 358: release_value (var->value); ! 359: } ! 360: ! 361: char * ! 362: internalvar_name (var) ! 363: struct internalvar *var; ! 364: { ! 365: return var->name; ! 366: } ! 367: ! 368: /* Free all internalvars. Done when new symtabs are loaded, ! 369: because that makes the values invalid. */ ! 370: ! 371: void ! 372: clear_internalvars () ! 373: { ! 374: register struct internalvar *var; ! 375: ! 376: while (internalvars) ! 377: { ! 378: var = internalvars; ! 379: internalvars = var->next; ! 380: free (var->name); ! 381: free (var->value); ! 382: free (var); ! 383: } ! 384: } ! 385: ! 386: static void ! 387: convenience_info () ! 388: { ! 389: register struct internalvar *var; ! 390: ! 391: if (internalvars) ! 392: printf ("Debugger convenience variables:\n\n"); ! 393: else ! 394: printf ("No debugger convenience variables now defined.\n\ ! 395: Convenience variables have names starting with \"$\";\n\ ! 396: use \"set\" as in \"set $foo = 5\" to define them.\n"); ! 397: ! 398: for (var = internalvars; var; var = var->next) ! 399: { ! 400: printf ("$%s: ", var->name); ! 401: value_print (var->value, stdout, 0); ! 402: printf ("\n"); ! 403: } ! 404: } ! 405: ! 406: /* Extract a value as a C number (either long or double). ! 407: Knows how to convert fixed values to double, or ! 408: floating values to long. ! 409: Does not deallocate the value. */ ! 410: ! 411: long ! 412: value_as_long (val) ! 413: register value val; ! 414: { ! 415: return unpack_long (VALUE_TYPE (val), VALUE_CONTENTS (val)); ! 416: } ! 417: ! 418: double ! 419: value_as_double (val) ! 420: register value val; ! 421: { ! 422: return unpack_double (VALUE_TYPE (val), VALUE_CONTENTS (val)); ! 423: } ! 424: ! 425: /* Unpack raw data (copied from debugee) at VALADDR ! 426: as a long, or as a double, assuming the raw data is described ! 427: by type TYPE. Knows how to convert different sizes of values ! 428: and can convert between fixed and floating point. */ ! 429: ! 430: long ! 431: unpack_long (type, valaddr) ! 432: struct type *type; ! 433: char *valaddr; ! 434: { ! 435: register enum type_code code = TYPE_CODE (type); ! 436: register int len = TYPE_LENGTH (type); ! 437: register int nosign = TYPE_UNSIGNED (type); ! 438: ! 439: if (code == TYPE_CODE_ENUM) ! 440: code = TYPE_CODE_INT; ! 441: if (code == TYPE_CODE_FLT) ! 442: { ! 443: if (len == sizeof (float)) ! 444: return * (float *) valaddr; ! 445: ! 446: if (len == sizeof (double)) ! 447: return * (double *) valaddr; ! 448: } ! 449: else if (code == TYPE_CODE_INT && nosign) ! 450: { ! 451: if (len == sizeof (char)) ! 452: return * (unsigned char *) valaddr; ! 453: ! 454: if (len == sizeof (short)) ! 455: return * (unsigned short *) valaddr; ! 456: ! 457: if (len == sizeof (int)) ! 458: return * (unsigned int *) valaddr; ! 459: ! 460: if (len == sizeof (long)) ! 461: return * (unsigned long *) valaddr; ! 462: } ! 463: else if (code == TYPE_CODE_INT) ! 464: { ! 465: if (len == sizeof (char)) ! 466: return * (char *) valaddr; ! 467: ! 468: if (len == sizeof (short)) ! 469: return * (short *) valaddr; ! 470: ! 471: if (len == sizeof (int)) ! 472: return * (int *) valaddr; ! 473: ! 474: if (len == sizeof (long)) ! 475: return * (long *) valaddr; ! 476: } ! 477: else if (code == TYPE_CODE_PTR) ! 478: { ! 479: if (len == sizeof (char *)) ! 480: return (CORE_ADDR) * (char **) valaddr; ! 481: } ! 482: ! 483: error ("Value not integer or pointer."); ! 484: } ! 485: ! 486: double ! 487: unpack_double (type, valaddr) ! 488: struct type *type; ! 489: char *valaddr; ! 490: { ! 491: register enum type_code code = TYPE_CODE (type); ! 492: register int len = TYPE_LENGTH (type); ! 493: register int nosign = TYPE_UNSIGNED (type); ! 494: ! 495: if (code == TYPE_CODE_FLT) ! 496: { ! 497: if (INVALID_FLOAT (valaddr, len)) ! 498: error ("Invalid floating value found in program."); ! 499: ! 500: if (len == sizeof (float)) ! 501: return * (float *) valaddr; ! 502: ! 503: if (len == sizeof (double)) ! 504: { ! 505: /* Some machines require doubleword alignment for doubles. ! 506: This code works on them, and on other machines. */ ! 507: double temp; ! 508: bcopy ((char *) valaddr, (char *) &temp, sizeof (double)); ! 509: return temp; ! 510: } ! 511: } ! 512: else if (code == TYPE_CODE_INT && nosign) ! 513: { ! 514: if (len == sizeof (char)) ! 515: return * (unsigned char *) valaddr; ! 516: ! 517: if (len == sizeof (short)) ! 518: return * (unsigned short *) valaddr; ! 519: ! 520: if (len == sizeof (int)) ! 521: return * (unsigned int *) valaddr; ! 522: ! 523: if (len == sizeof (long)) ! 524: return * (unsigned long *) valaddr; ! 525: } ! 526: else if (code == TYPE_CODE_INT) ! 527: { ! 528: if (len == sizeof (char)) ! 529: return * (char *) valaddr; ! 530: ! 531: if (len == sizeof (short)) ! 532: return * (short *) valaddr; ! 533: ! 534: if (len == sizeof (int)) ! 535: return * (int *) valaddr; ! 536: ! 537: if (len == sizeof (long)) ! 538: return * (long *) valaddr; ! 539: } ! 540: ! 541: error ("Value not floating number."); ! 542: } ! 543: ! 544: /* Given a value ARG1 of a struct or union type, ! 545: extract and return the value of one of its fields. ! 546: FIELDNO says which field. */ ! 547: ! 548: value ! 549: value_field (arg1, fieldno) ! 550: register value arg1; ! 551: register int fieldno; ! 552: { ! 553: register value v; ! 554: register struct type *type = TYPE_FIELD_TYPE (VALUE_TYPE (arg1), fieldno); ! 555: register int offset; ! 556: ! 557: /* Handle packed fields */ ! 558: ! 559: offset = TYPE_FIELD_BITPOS (VALUE_TYPE (arg1), fieldno) / 8; ! 560: if (TYPE_FIELD_BITSIZE (VALUE_TYPE (arg1), fieldno)) ! 561: { ! 562: v = value_from_long (type, ! 563: unpack_field_as_long (VALUE_TYPE (arg1), ! 564: VALUE_CONTENTS (arg1), ! 565: fieldno)); ! 566: VALUE_BITPOS (v) = TYPE_FIELD_BITPOS (VALUE_TYPE (arg1), fieldno) % 8; ! 567: VALUE_BITSIZE (v) = TYPE_FIELD_BITSIZE (VALUE_TYPE (arg1), fieldno); ! 568: } ! 569: else ! 570: { ! 571: v = allocate_value (type); ! 572: bcopy (VALUE_CONTENTS (arg1) + offset, ! 573: VALUE_CONTENTS (v), ! 574: TYPE_LENGTH (type)); ! 575: } ! 576: VALUE_LVAL (v) = VALUE_LVAL (arg1); ! 577: if (VALUE_LVAL (arg1) == lval_internalvar) ! 578: VALUE_LVAL (v) = lval_internalvar_component; ! 579: VALUE_ADDRESS (v) = VALUE_ADDRESS (arg1); ! 580: VALUE_OFFSET (v) = offset + VALUE_OFFSET (arg1); ! 581: return v; ! 582: } ! 583: ! 584: long ! 585: unpack_field_as_long (type, valaddr, fieldno) ! 586: struct type *type; ! 587: char *valaddr; ! 588: int fieldno; ! 589: { ! 590: long val; ! 591: int bitpos = TYPE_FIELD_BITPOS (type, fieldno); ! 592: int bitsize = TYPE_FIELD_BITSIZE (type, fieldno); ! 593: union { int i; char c; } test; ! 594: ! 595: bcopy (valaddr + bitpos / 8, &val, sizeof val); ! 596: ! 597: /* Extracting bits depends on endianness of the machine. */ ! 598: test.i = 1; ! 599: if (test.c == 1) ! 600: /* Little-endian. */ ! 601: val = val >> (bitpos % 8); ! 602: else ! 603: val = val >> (sizeof val * 8 - bitpos % 8 - bitsize); ! 604: ! 605: val &= (1 << bitsize) - 1; ! 606: return val; ! 607: } ! 608: ! 609: modify_field (addr, fieldval, bitpos, bitsize) ! 610: char *addr; ! 611: int fieldval; ! 612: int bitpos, bitsize; ! 613: { ! 614: long oword; ! 615: union { int i; char c; } test; ! 616: ! 617: bcopy (addr, &oword, sizeof oword); ! 618: ! 619: /* Shifting for bit field depends on endianness of the machine. */ ! 620: test.c = 1; ! 621: if (test.i != 1) ! 622: /* not little-endian: assume big-endian. */ ! 623: bitpos = sizeof oword * 8 - bitpos - bitsize; ! 624: ! 625: oword &= ~(((1 << bitsize) - 1) << bitpos); ! 626: oword |= fieldval << bitpos; ! 627: bcopy (&oword, addr, sizeof oword); ! 628: } ! 629: ! 630: /* Convert C numbers into newly allocated values */ ! 631: ! 632: value ! 633: value_from_long (type, num) ! 634: struct type *type; ! 635: register long num; ! 636: { ! 637: register value val = allocate_value (type); ! 638: register enum type_code code = TYPE_CODE (type); ! 639: register int len = TYPE_LENGTH (type); ! 640: ! 641: if (code == TYPE_CODE_INT || code == TYPE_CODE_ENUM) ! 642: { ! 643: if (len == sizeof (char)) ! 644: * (char *) VALUE_CONTENTS (val) = num; ! 645: else if (len == sizeof (short)) ! 646: * (short *) VALUE_CONTENTS (val) = num; ! 647: else if (len == sizeof (int)) ! 648: * (int *) VALUE_CONTENTS (val) = num; ! 649: else if (len == sizeof (long)) ! 650: * (long *) VALUE_CONTENTS (val) = num; ! 651: else ! 652: error ("Integer type encountered with unexpected data length."); ! 653: } ! 654: else ! 655: error ("Unexpected type encountered for integer constant."); ! 656: ! 657: return val; ! 658: } ! 659: ! 660: value ! 661: value_from_double (type, num) ! 662: struct type *type; ! 663: double num; ! 664: { ! 665: register value val = allocate_value (type); ! 666: register enum type_code code = TYPE_CODE (type); ! 667: register int len = TYPE_LENGTH (type); ! 668: ! 669: if (code == TYPE_CODE_FLT) ! 670: { ! 671: if (len == sizeof (float)) ! 672: * (float *) VALUE_CONTENTS (val) = num; ! 673: else if (len == sizeof (double)) ! 674: * (double *) VALUE_CONTENTS (val) = num; ! 675: else ! 676: error ("Floating type encountered with unexpected data length."); ! 677: } ! 678: else ! 679: error ("Unexpected type encountered for floating constant."); ! 680: ! 681: return val; ! 682: } ! 683: ! 684: /* Deal with the value that is "about to be returned". */ ! 685: ! 686: /* Return the value that a function returning now ! 687: would be returning to its caller, assuming its type is VALTYPE. ! 688: RETBUF is where we look for what ought to be the contents ! 689: of the registers (in raw form). This is because it is often ! 690: desirable to restore old values to those registers ! 691: after saving the contents of interest, and then call ! 692: this function using the saved values. */ ! 693: ! 694: value ! 695: value_being_returned (valtype, retbuf) ! 696: register struct type *valtype; ! 697: char retbuf[REGISTER_BYTES]; ! 698: { ! 699: register value val; ! 700: ! 701: if (TYPE_CODE (valtype) == TYPE_CODE_STRUCT ! 702: || TYPE_CODE (valtype) == TYPE_CODE_UNION) ! 703: return value_at (valtype, EXTRACT_STRUCT_VALUE_ADDRESS (retbuf)); ! 704: ! 705: val = allocate_value (valtype); ! 706: EXTRACT_RETURN_VALUE (valtype, retbuf, VALUE_CONTENTS (val)); ! 707: ! 708: return val; ! 709: } ! 710: ! 711: /* Store VAL so it will be returned if a function returns now. ! 712: Does not verify that VAL's type matches what the current ! 713: function wants to return. */ ! 714: ! 715: void ! 716: set_return_value (val) ! 717: value val; ! 718: { ! 719: register enum type_code code = TYPE_CODE (VALUE_TYPE (val)); ! 720: char regbuf[REGISTER_BYTES]; ! 721: double dbuf; ! 722: long lbuf; ! 723: ! 724: if (code == TYPE_CODE_STRUCT ! 725: || code == TYPE_CODE_UNION) ! 726: error ("Specifying a struct or union return value is not supported."); ! 727: ! 728: if (code == TYPE_CODE_FLT) ! 729: { ! 730: dbuf = value_as_double (val); ! 731: ! 732: STORE_RETURN_VALUE (VALUE_TYPE (val), &dbuf); ! 733: } ! 734: else ! 735: { ! 736: lbuf = value_as_long (val); ! 737: STORE_RETURN_VALUE (VALUE_TYPE (val), &lbuf); ! 738: } ! 739: } ! 740: ! 741: static ! 742: initialize () ! 743: { ! 744: add_info ("convenience", convenience_info, ! 745: "Debugger convenience (\"$foo\") variables.\n\ ! 746: These variables are created when you assign them values;\n\ ! 747: thus, \"print $foo=1\" gives \"$foo\" the value 1. Values may be any type.\n\n\ ! 748: A few convenience variables are given values automatically GDB:\n\ ! 749: \"$_\"holds the last address examined with \"x\" or \"info lines\",\n\ ! 750: \"$__\" holds the contents of the last address examined with \"x\"."); ! 751: ! 752: add_info ("history", history_info, ! 753: "Elements of value history (around item number IDX, or last ten)."); ! 754: } ! 755: ! 756: END_FILE
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.