|
|
1.1 ! root 1: /* Perform non-arithmetic operations on 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 "defs.h" ! 22: #include "initialize.h" ! 23: #include "param.h" ! 24: #include "symtab.h" ! 25: #include "value.h" ! 26: ! 27: START_FILE ! 28: ! 29: /* Cast value ARG2 to type TYPE and return as a value. ! 30: More general than a C cast: accepts any two types of the same length, ! 31: and if ARG2 is an lvalue it can be cast into anything at all. */ ! 32: ! 33: value ! 34: value_cast (type, arg2) ! 35: struct type *type; ! 36: register value arg2; ! 37: { ! 38: register enum type_code code1; ! 39: register enum type_code code2; ! 40: register int scalar; ! 41: ! 42: /* Coerce arrays but not enums. Enums will work as-is ! 43: and coercing them would cause an infinite recursion. */ ! 44: if (TYPE_CODE (VALUE_TYPE (arg2)) != TYPE_CODE_ENUM) ! 45: COERCE_ARRAY (arg2); ! 46: ! 47: code1 = TYPE_CODE (type); ! 48: code2 = TYPE_CODE (VALUE_TYPE (arg2)); ! 49: scalar = (code2 == TYPE_CODE_INT || code2 == TYPE_CODE_FLT ! 50: || code2 == TYPE_CODE_ENUM); ! 51: ! 52: if (code1 == TYPE_CODE_FLT && scalar) ! 53: return value_from_double (type, value_as_double (arg2)); ! 54: else if ((code1 == TYPE_CODE_INT || code1 == TYPE_CODE_ENUM) ! 55: && (scalar || code2 == TYPE_CODE_PTR)) ! 56: return value_from_long (type, value_as_long (arg2)); ! 57: else if (TYPE_LENGTH (type) == TYPE_LENGTH (VALUE_TYPE (arg2))) ! 58: { ! 59: VALUE_TYPE (arg2) = type; ! 60: return arg2; ! 61: } ! 62: else if (VALUE_LVAL (arg2) == lval_memory) ! 63: return value_at (type, VALUE_ADDRESS (arg2) + VALUE_OFFSET (arg2)); ! 64: else ! 65: error ("Invalid cast."); ! 66: } ! 67: ! 68: /* Return the value with a specified type located at specified address. */ ! 69: ! 70: value ! 71: value_at (type, addr) ! 72: struct type *type; ! 73: CORE_ADDR addr; ! 74: { ! 75: register value val = allocate_value (type); ! 76: ! 77: read_memory (addr, VALUE_CONTENTS (val), TYPE_LENGTH (type)); ! 78: VALUE_LVAL (val) = lval_memory; ! 79: VALUE_ADDRESS (val) = addr; ! 80: ! 81: return val; ! 82: } ! 83: ! 84: /* Store the contents of FROMVAL into the location of TOVAL. ! 85: Return a new value with the location of TOVAL and contents of FROMVAL. */ ! 86: ! 87: value ! 88: value_assign (toval, fromval) ! 89: register value toval, fromval; ! 90: { ! 91: register struct type *type = VALUE_TYPE (toval); ! 92: register value val; ! 93: char raw_buffer[MAX_REGISTER_RAW_SIZE]; ! 94: char virtual_buffer[MAX_REGISTER_VIRTUAL_SIZE]; ! 95: int use_buffer = 0; ! 96: ! 97: COERCE_ARRAY (fromval); ! 98: ! 99: if (VALUE_LVAL (toval) != lval_internalvar) ! 100: fromval = value_cast (type, fromval); ! 101: ! 102: /* If TOVAL is a special machine register requiring conversion ! 103: of program values to a special raw format, ! 104: convert FROMVAL's contents now, with result in `raw_buffer', ! 105: and set USE_BUFFER to the number of bytes to write. */ ! 106: ! 107: if (VALUE_REGNO (toval) >= 0 ! 108: && REGISTER_CONVERTIBLE (VALUE_REGNO (toval))) ! 109: { ! 110: int regno = VALUE_REGNO (toval); ! 111: if (VALUE_TYPE (fromval) != REGISTER_VIRTUAL_TYPE (regno)) ! 112: fromval = value_cast (REGISTER_VIRTUAL_TYPE (regno), fromval); ! 113: bcopy (VALUE_CONTENTS (fromval), virtual_buffer, ! 114: REGISTER_VIRTUAL_SIZE (regno)); ! 115: REGISTER_CONVERT_TO_RAW (regno, virtual_buffer, raw_buffer); ! 116: use_buffer = REGISTER_RAW_SIZE (regno); ! 117: } ! 118: ! 119: switch (VALUE_LVAL (toval)) ! 120: { ! 121: case lval_internalvar: ! 122: set_internalvar (VALUE_INTERNALVAR (toval), fromval); ! 123: break; ! 124: ! 125: case lval_internalvar_component: ! 126: set_internalvar_component (VALUE_INTERNALVAR (toval), ! 127: VALUE_OFFSET (toval), ! 128: VALUE_BITPOS (toval), ! 129: VALUE_BITSIZE (toval), ! 130: fromval); ! 131: break; ! 132: ! 133: case lval_memory: ! 134: if (VALUE_BITSIZE (toval)) ! 135: { ! 136: int val; ! 137: read_memory (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval), ! 138: &val, sizeof val); ! 139: modify_field (&val, value_as_long (fromval), ! 140: VALUE_BITPOS (toval), VALUE_BITSIZE (toval)); ! 141: write_memory (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval), ! 142: &val, sizeof val); ! 143: } ! 144: else if (use_buffer) ! 145: write_memory (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval), ! 146: raw_buffer, use_buffer); ! 147: else ! 148: write_memory (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval), ! 149: VALUE_CONTENTS (fromval), TYPE_LENGTH (type)); ! 150: break; ! 151: ! 152: case lval_register: ! 153: if (VALUE_BITSIZE (toval)) ! 154: { ! 155: int val; ! 156: ! 157: read_register_bytes (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval), ! 158: &val, sizeof val); ! 159: modify_field (&val, value_as_long (fromval), ! 160: VALUE_BITPOS (toval), VALUE_BITSIZE (toval)); ! 161: write_register_bytes (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval), ! 162: &val, sizeof val); ! 163: } ! 164: else if (use_buffer) ! 165: write_register_bytes (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval), ! 166: raw_buffer, use_buffer); ! 167: else ! 168: write_register_bytes (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval), ! 169: VALUE_CONTENTS (fromval), TYPE_LENGTH (type)); ! 170: break; ! 171: ! 172: default: ! 173: error ("Left side of = operation is not an lvalue."); ! 174: } ! 175: ! 176: /* Return a value just like TOVAL except with the contents of FROMVAL. */ ! 177: ! 178: val = allocate_value (type); ! 179: bcopy (toval, val, VALUE_CONTENTS (val) - (char *) val); ! 180: bcopy (VALUE_CONTENTS (fromval), VALUE_CONTENTS (val), TYPE_LENGTH (type)); ! 181: ! 182: return val; ! 183: } ! 184: ! 185: /* Extend a value VAL to COUNT repetitions of its type. */ ! 186: ! 187: value ! 188: value_repeat (arg1, count) ! 189: value arg1; ! 190: int count; ! 191: { ! 192: register value val; ! 193: ! 194: if (VALUE_LVAL (arg1) != lval_memory) ! 195: error ("Only values in memory can be extended with '@'."); ! 196: if (count < 1) ! 197: error ("Invalid number %d of repetitions.", count); ! 198: ! 199: val = allocate_repeat_value (VALUE_TYPE (arg1), count); ! 200: ! 201: read_memory (VALUE_ADDRESS (arg1) + VALUE_OFFSET (arg1), ! 202: VALUE_CONTENTS (val), ! 203: TYPE_LENGTH (VALUE_TYPE (val)) * count); ! 204: VALUE_LVAL (val) = lval_memory; ! 205: VALUE_ADDRESS (val) = VALUE_ADDRESS (arg1) + VALUE_OFFSET (arg1); ! 206: ! 207: return val; ! 208: } ! 209: ! 210: value ! 211: value_of_variable (var) ! 212: struct symbol *var; ! 213: { ! 214: return read_var_value (var, (CORE_ADDR) 0); ! 215: } ! 216: ! 217: /* Given a value which is an array, return a value which is ! 218: a pointer to its first element. */ ! 219: ! 220: value ! 221: value_coerce_array (arg1) ! 222: value arg1; ! 223: { ! 224: register struct type *type; ! 225: register value val; ! 226: ! 227: if (VALUE_LVAL (arg1) != lval_memory) ! 228: error ("Attempt to take address of value not located in memory."); ! 229: ! 230: /* Get type of elements. */ ! 231: if (TYPE_CODE (VALUE_TYPE (arg1)) == TYPE_CODE_ARRAY) ! 232: type = TYPE_TARGET_TYPE (VALUE_TYPE (arg1)); ! 233: else ! 234: /* A phony array made by value_repeat. ! 235: Its type is the type of the elements, not an array type. */ ! 236: type = VALUE_TYPE (arg1); ! 237: ! 238: /* Get the type of the result. */ ! 239: type = lookup_pointer_type (type); ! 240: val = value_from_long (builtin_type_long, ! 241: VALUE_ADDRESS (arg1) + VALUE_OFFSET (arg1)); ! 242: VALUE_TYPE (val) = type; ! 243: return val; ! 244: } ! 245: ! 246: /* Return a pointer value for the object for which ARG1 is the contents. */ ! 247: ! 248: value ! 249: value_addr (arg1) ! 250: value arg1; ! 251: { ! 252: register struct type *type; ! 253: register value val, arg1_coerced; ! 254: ! 255: /* Taking the address of an array is really a no-op ! 256: once the array is coerced to a pointer to its first element. */ ! 257: arg1_coerced = arg1; ! 258: COERCE_ARRAY (arg1_coerced); ! 259: if (arg1 != arg1_coerced) ! 260: return arg1_coerced; ! 261: ! 262: if (VALUE_LVAL (arg1) != lval_memory) ! 263: error ("Attempt to take address of value not located in memory."); ! 264: ! 265: /* Get the type of the result. */ ! 266: type = lookup_pointer_type (VALUE_TYPE (arg1)); ! 267: val = value_from_long (builtin_type_long, ! 268: VALUE_ADDRESS (arg1) + VALUE_OFFSET (arg1)); ! 269: VALUE_TYPE (val) = type; ! 270: return val; ! 271: } ! 272: ! 273: /* Given a value of a pointer type, apply the C unary * operator to it. */ ! 274: ! 275: value ! 276: value_ind (arg1) ! 277: value arg1; ! 278: { ! 279: COERCE_ARRAY (arg1); ! 280: ! 281: /* Allow * on an integer so we can cast it to whatever we want. */ ! 282: if (TYPE_CODE (VALUE_TYPE (arg1)) == TYPE_CODE_INT) ! 283: return value_at (builtin_type_long, ! 284: (CORE_ADDR) value_as_long (arg1)); ! 285: else if (TYPE_CODE (VALUE_TYPE (arg1)) == TYPE_CODE_PTR) ! 286: return value_at (TYPE_TARGET_TYPE (VALUE_TYPE (arg1)), ! 287: (CORE_ADDR) value_as_long (arg1)); ! 288: error ("Attempt to take contents of a non-pointer value."); ! 289: } ! 290: ! 291: /* Pushing small parts of stack frames. */ ! 292: ! 293: /* Push one word (the size of object that a register holds). */ ! 294: ! 295: CORE_ADDR ! 296: push_word (sp, buffer) ! 297: CORE_ADDR sp; ! 298: REGISTER_TYPE buffer; ! 299: { ! 300: register int len = sizeof (REGISTER_TYPE); ! 301: ! 302: #if 1 INNER_THAN 2 ! 303: sp -= len; ! 304: write_memory (sp, &buffer, len); ! 305: #else /* stack grows upward */ ! 306: write_memory (sp, &buffer, len); ! 307: sp += len; ! 308: #endif /* stack grows upward */ ! 309: ! 310: return sp; ! 311: } ! 312: ! 313: /* Push LEN bytes with data at BUFFER. */ ! 314: ! 315: CORE_ADDR ! 316: push_bytes (sp, buffer, len) ! 317: CORE_ADDR sp; ! 318: char *buffer; ! 319: int len; ! 320: { ! 321: #if 1 INNER_THAN 2 ! 322: sp -= len; ! 323: write_memory (sp, buffer, len); ! 324: #else /* stack grows upward */ ! 325: write_memory (sp, buffer, len); ! 326: sp += len; ! 327: #endif /* stack grows upward */ ! 328: ! 329: return sp; ! 330: } ! 331: ! 332: /* Push onto the stack the specified value VALUE. */ ! 333: ! 334: CORE_ADDR ! 335: value_push (sp, arg) ! 336: register CORE_ADDR sp; ! 337: value arg; ! 338: { ! 339: register int len = TYPE_LENGTH (VALUE_TYPE (arg)); ! 340: ! 341: #if 1 INNER_THAN 2 ! 342: sp -= len; ! 343: write_memory (sp, VALUE_CONTENTS (arg), len); ! 344: #else /* stack grows upward */ ! 345: write_memory (sp, VALUE_CONTENTS (arg), len); ! 346: sp += len; ! 347: #endif /* stack grows upward */ ! 348: ! 349: return sp; ! 350: } ! 351: ! 352: /* Perform the standard coercions that are specified ! 353: for arguments to be passed to C functions. */ ! 354: ! 355: value ! 356: value_arg_coerce (arg) ! 357: value arg; ! 358: { ! 359: register struct type *type; ! 360: ! 361: COERCE_ENUM (arg); ! 362: ! 363: type = VALUE_TYPE (arg); ! 364: ! 365: if (TYPE_CODE (type) == TYPE_CODE_INT ! 366: && TYPE_LENGTH (type) < sizeof (int)) ! 367: return value_cast (builtin_type_int, arg); ! 368: ! 369: if (type == builtin_type_float) ! 370: return value_cast (builtin_type_double, arg); ! 371: ! 372: return arg; ! 373: } ! 374: ! 375: /* Push the value ARG, first coercing it as an argument ! 376: to a C function. */ ! 377: ! 378: CORE_ADDR ! 379: value_arg_push (sp, arg) ! 380: register CORE_ADDR sp; ! 381: value arg; ! 382: { ! 383: return value_push (sp, value_arg_coerce (arg)); ! 384: } ! 385: ! 386: /* Perform a function call in the inferior. ! 387: ARGS is a vector of values of arguments (NARGS of them). ! 388: FUNCTION is a value, the function to be called. ! 389: Returns a value representing what the function returned. ! 390: May fail to return, if a breakpoint or signal is hit ! 391: during the execution of the function. */ ! 392: ! 393: value ! 394: call_function (function, nargs, args) ! 395: value function; ! 396: int nargs; ! 397: value *args; ! 398: { ! 399: register CORE_ADDR sp; ! 400: register int i; ! 401: CORE_ADDR start_sp; ! 402: static REGISTER_TYPE dummy[] = CALL_DUMMY; ! 403: REGISTER_TYPE dummy1[sizeof dummy / sizeof (REGISTER_TYPE)]; ! 404: CORE_ADDR old_sp; ! 405: struct type *value_type; ! 406: ! 407: PUSH_DUMMY_FRAME; ! 408: ! 409: { ! 410: register CORE_ADDR funaddr; ! 411: register struct type *ftype = VALUE_TYPE (function); ! 412: register enum type_code code = TYPE_CODE (ftype); ! 413: ! 414: /* Determine address to call. */ ! 415: if (code == TYPE_CODE_FUNC) ! 416: { ! 417: funaddr = VALUE_ADDRESS (function); ! 418: value_type = TYPE_TARGET_TYPE (ftype); ! 419: } ! 420: else if (code == TYPE_CODE_PTR) ! 421: { ! 422: funaddr = value_as_long (function); ! 423: if (TYPE_CODE (TYPE_TARGET_TYPE (ftype)) ! 424: == TYPE_CODE_FUNC) ! 425: value_type = TYPE_TARGET_TYPE (TYPE_TARGET_TYPE (ftype)); ! 426: else ! 427: value_type = builtin_type_int; ! 428: } ! 429: else if (code == TYPE_CODE_INT) ! 430: { ! 431: /* Handle the case of functions lacking debugging info. ! 432: Their values are characters since their addresses are char */ ! 433: if (TYPE_LENGTH (ftype) == 1) ! 434: funaddr = value_as_long (value_addr (function)); ! 435: else ! 436: /* Handle integer used as address of a function. */ ! 437: funaddr = value_as_long (function); ! 438: ! 439: value_type = builtin_type_int; ! 440: } ! 441: else ! 442: error ("Invalid data type for function to be called."); ! 443: ! 444: /* Create a call sequence customized for this function ! 445: and the number of arguments for it. */ ! 446: bcopy (dummy, dummy1, sizeof dummy); ! 447: FIX_CALL_DUMMY (dummy1, funaddr, nargs); ! 448: } ! 449: ! 450: old_sp = sp = read_register (SP_REGNUM); ! 451: ! 452: #if 1 INNER_THAN 2 /* Stack grows down */ ! 453: sp -= sizeof dummy; ! 454: write_memory (sp, dummy1, sizeof dummy); ! 455: start_sp = sp; ! 456: for (i = nargs - 1; i >= 0; i--) ! 457: sp = value_arg_push (sp, args[i]); ! 458: #else /* Stack grows up */ ! 459: start_sp = sp; ! 460: write_memory (sp, dummy1, sizeof dummy); ! 461: sp += sizeof dummy; ! 462: for (i = 0; i < nargs; i++) ! 463: sp = value_arg_push (sp, args[i]); ! 464: #endif /* Stack grows up */ ! 465: ! 466: write_register (SP_REGNUM, sp); ! 467: ! 468: /* Figure out the value returned by the function. */ ! 469: { ! 470: char retbuf[REGISTER_BYTES]; ! 471: ! 472: /* Execute the stack dummy routine, calling FUNCTION. ! 473: When it is done, discard the empty frame ! 474: after storing the contents of all regs into retbuf. */ ! 475: run_stack_dummy (start_sp + CALL_DUMMY_START_OFFSET, retbuf); ! 476: ! 477: return value_being_returned (value_type, retbuf); ! 478: } ! 479: } ! 480: ! 481: /* Create a value for a string constant: ! 482: Call the function malloc in the inferior to get space for it, ! 483: then copy the data into that space ! 484: and then return the address with type char *. ! 485: PTR points to the string constant data; LEN is number of characters. */ ! 486: ! 487: value ! 488: value_string (ptr, len) ! 489: char *ptr; ! 490: int len; ! 491: { ! 492: register value val; ! 493: register struct symbol *sym; ! 494: value blocklen; ! 495: register char *copy = (char *) alloca (len + 1); ! 496: char *i = ptr; ! 497: register char *o = copy, *ibeg = ptr; ! 498: register int c; ! 499: ! 500: /* Copy the string into COPY, processing escapes. ! 501: We could not conveniently process them in expread ! 502: because the string there wants to be a substring of the input. */ ! 503: ! 504: while (i - ibeg < len) ! 505: { ! 506: c = *i++; ! 507: if (c == '\\') ! 508: { ! 509: c = parse_escape (&i); ! 510: if (c == -1) ! 511: continue; ! 512: } ! 513: *o++ = c; ! 514: } ! 515: *o = 0; ! 516: ! 517: /* Get the length of the string after escapes are processed. */ ! 518: ! 519: len = o - copy; ! 520: ! 521: /* Find the address of malloc in the inferior. */ ! 522: ! 523: sym = lookup_symbol ("malloc", 0, VAR_NAMESPACE); ! 524: if (sym != 0) ! 525: { ! 526: if (SYMBOL_CLASS (sym) != LOC_BLOCK) ! 527: error ("\"malloc\" exists in this program but is not a function."); ! 528: val = value_of_variable (sym); ! 529: } ! 530: else ! 531: { ! 532: register int i; ! 533: for (i = 0; i < misc_function_count; i++) ! 534: if (!strcmp (misc_function_vector[i].name, "malloc")) ! 535: break; ! 536: if (i < misc_function_count) ! 537: val = value_from_long (builtin_type_long, ! 538: misc_function_vector[i].address); ! 539: else ! 540: error ("String constants require the program to have a function \"malloc\"."); ! 541: } ! 542: ! 543: blocklen = value_from_long (builtin_type_int, len + 1); ! 544: val = call_function (val, 1, &blocklen); ! 545: if (value_zerop (val)) ! 546: error ("No memory available for string constant."); ! 547: write_memory (value_as_long (val), copy, len + 1); ! 548: VALUE_TYPE (val) = lookup_pointer_type (builtin_type_char); ! 549: return val; ! 550: } ! 551: ! 552: /* Given ARG1, a value of type (pointer to a)* structure/union, ! 553: extract the component named NAME from the ultimate target structure/union ! 554: and return it as a value with its appropriate type. ! 555: ERR is used in the error message if ARG1's type is wrong. */ ! 556: ! 557: value ! 558: value_struct_elt (arg1, name, err) ! 559: register value arg1; ! 560: char *name; ! 561: char *err; ! 562: { ! 563: register struct type *t; ! 564: register int i; ! 565: ! 566: COERCE_ARRAY (arg1); ! 567: ! 568: t = VALUE_TYPE (arg1); ! 569: ! 570: /* Follow pointers until we get to a non-pointer. */ ! 571: ! 572: while (TYPE_CODE (t) == TYPE_CODE_PTR) ! 573: { ! 574: arg1 = value_ind (arg1); ! 575: COERCE_ARRAY (arg1); ! 576: t = VALUE_TYPE (arg1); ! 577: } ! 578: ! 579: if (TYPE_CODE (t) != TYPE_CODE_STRUCT ! 580: && ! 581: TYPE_CODE (t) != TYPE_CODE_UNION) ! 582: error ("Attempt to extract a component of a value that is not a %s.", err); ! 583: ! 584: for (i = TYPE_NFIELDS (t) - 1; i >= 0; i--) ! 585: { ! 586: if (!strcmp (TYPE_FIELD_NAME (t, i), name)) ! 587: break; ! 588: } ! 589: ! 590: if (i < 0) ! 591: error ("Structure has no component named %s.", name); ! 592: ! 593: return value_field (arg1, i); ! 594: } ! 595: ! 596: static ! 597: initialize () ! 598: { } ! 599: ! 600: END_FILE
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.