Annotation of 43BSDReno/contrib/emacs-18.55/gdb/findvar.c, revision 1.1.1.1

1.1       root        1: /* Find a variable's value in memory, for GDB, the GNU debugger.
                      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 "frame.h"
                     26: #include "value.h"
                     27: 
                     28: CORE_ADDR read_register ();
                     29: 
                     30: START_FILE
                     31: 
                     32: /* Return the address in which frame FRAME's value of register REGNUM
                     33:    has been saved in memory.  Or return zero if it has not been saved.
                     34:    If REGNUM specifies the SP, the value we return is actually
                     35:    the SP value, not an address where it was saved.  */
                     36: 
                     37: static CORE_ADDR
                     38: find_saved_register (frame, regnum)
                     39:      FRAME frame;
                     40:      int regnum;
                     41: {
                     42:   struct frame_info fi;
                     43:   struct frame_saved_regs saved_regs;
                     44: 
                     45:   register FRAME frame1 = 0;
                     46:   register CORE_ADDR addr = 0;
                     47: 
                     48:   while (1)
                     49:     {
                     50:       QUIT;
                     51:       fi = get_prev_frame_info (frame1);
                     52:       if (fi.frame == 0 || fi.frame == frame)
                     53:        break;
                     54:       get_frame_saved_regs (&fi, &saved_regs);
                     55:       if (saved_regs.regs[regnum])
                     56:        addr = saved_regs.regs[regnum];
                     57:       frame1 = fi.frame;
                     58:     }
                     59: 
                     60:   return addr;
                     61: }
                     62: 
                     63: /* Copy the bytes of register REGNUM, relative to the current stack frame,
                     64:    into our memory at MYADDR.
                     65:    The number of bytes copied is REGISTER_RAW_SIZE (REGNUM).  */
                     66: 
                     67: void
                     68: read_relative_register_raw_bytes (regnum, myaddr)
                     69:      int regnum;
                     70:      char *myaddr;
                     71: {
                     72:   register CORE_ADDR addr;
                     73: 
                     74:   if (regnum == FP_REGNUM)
                     75:     {
                     76:       bcopy (&selected_frame, myaddr, sizeof (CORE_ADDR));
                     77:       return;
                     78:     }
                     79: 
                     80:   addr = find_saved_register (selected_frame, regnum);
                     81: 
                     82:   if (addr)
                     83:     {
                     84:       if (regnum == SP_REGNUM)
                     85:        {
                     86:          CORE_ADDR buffer = addr;
                     87:          bcopy (&buffer, myaddr, sizeof (CORE_ADDR));
                     88:        }
                     89:       else
                     90:        read_memory (addr, myaddr, REGISTER_RAW_SIZE (regnum));
                     91:       return;
                     92:     }
                     93:   read_register_bytes (REGISTER_BYTE (regnum),
                     94:                       myaddr, REGISTER_RAW_SIZE (regnum));
                     95: }
                     96: 
                     97: /* Return a `value' with the contents of register REGNUM
                     98:    in its virtual format, with the type specified by
                     99:    REGISTER_VIRTUAL_TYPE.  */
                    100: 
                    101: value
                    102: value_of_register (regnum)
                    103:      int regnum;
                    104: {
                    105:   register CORE_ADDR addr = find_saved_register (selected_frame, regnum);
                    106:   register value val;
                    107:   char raw_buffer[MAX_REGISTER_RAW_SIZE];
                    108:   char virtual_buffer[MAX_REGISTER_VIRTUAL_SIZE];
                    109: 
                    110:   if (addr)
                    111:     {
                    112:       if (regnum == SP_REGNUM)
                    113:        return value_from_long (builtin_type_int, addr);
                    114:       read_memory (addr, raw_buffer, REGISTER_RAW_SIZE (regnum));
                    115:     }
                    116:   else
                    117:     read_register_bytes (REGISTER_BYTE (regnum), raw_buffer,
                    118:                         REGISTER_RAW_SIZE (regnum));
                    119: 
                    120:   REGISTER_CONVERT_TO_VIRTUAL (regnum, raw_buffer, virtual_buffer);
                    121:   val = allocate_value (REGISTER_VIRTUAL_TYPE (regnum));
                    122:   bcopy (virtual_buffer, VALUE_CONTENTS (val), REGISTER_VIRTUAL_SIZE (regnum));
                    123:   VALUE_LVAL (val) = addr ? lval_memory : lval_register;
                    124:   VALUE_ADDRESS (val) = addr ? addr : REGISTER_BYTE (regnum);
                    125:   VALUE_REGNO (val) = regnum;
                    126:   return val;
                    127: }
                    128: 
                    129: /* Low level examining and depositing of registers.
                    130: 
                    131:    Note that you must call `fetch_registers' once
                    132:    before examining or depositing any registers.  */
                    133: 
                    134: char registers[REGISTER_BYTES];
                    135: 
                    136: /* Copy LEN bytes of consecutive data from registers
                    137:    starting with the REGBYTE'th byte of register data
                    138:    into memory at MYADDR.  */
                    139: 
                    140: read_register_bytes (regbyte, myaddr, len)
                    141:      int regbyte;
                    142:      char *myaddr;
                    143:      int len;
                    144: {
                    145:   bcopy (&registers[regbyte], myaddr, len);
                    146: }
                    147: 
                    148: /* Copy LEN bytes of consecutive data from memory at MYADDR
                    149:    into registers starting with the REGBYTE'th byte of register data.  */
                    150: 
                    151: write_register_bytes (regbyte, myaddr, len)
                    152:      int regbyte;
                    153:      char *myaddr;
                    154:      int len;
                    155: {
                    156:   bcopy (myaddr, &registers[regbyte], len);
                    157:   if (have_inferior_p ())
                    158:     store_inferior_registers (-1);
                    159: }
                    160: 
                    161: /* Return the contents of register REGNO,
                    162:    regarding it as an integer.  */
                    163: 
                    164: CORE_ADDR
                    165: read_register (regno)
                    166:      int regno;
                    167: {
                    168:   /* This loses when REGISTER_RAW_SIZE (regno) != sizeof (int) */
                    169:   return *(int *) &registers[REGISTER_BYTE (regno)];
                    170: }
                    171: 
                    172: /* Store VALUE in the register number REGNO, regarded as an integer.  */
                    173: 
                    174: void
                    175: write_register (regno, val)
                    176:      int regno, val;
                    177: {
                    178:   /* This loses when REGISTER_RAW_SIZE (regno) != sizeof (int) */
                    179:   *(int *) &registers[REGISTER_BYTE (regno)] = val;
                    180: 
                    181:   if (have_inferior_p ())
                    182:     store_inferior_registers (regno);
                    183: }
                    184: 
                    185: /* Record that register REGNO contains VAL.
                    186:    This is used when the value is obtained from the inferior or core dump,
                    187:    so there is no need to store the value there.  */
                    188: 
                    189: void
                    190: supply_register (regno, val)
                    191:      int regno;
                    192:      char *val;
                    193: {
                    194:   bcopy (val, &registers[REGISTER_BYTE (regno)], REGISTER_RAW_SIZE (regno));
                    195: }
                    196: 
                    197: /* Given a struct symbol for a variable,
                    198:    and a stack frame address, read the value of the variable
                    199:    and return a (pointer to a) struct value containing the value.  */
                    200: 
                    201: value
                    202: read_var_value (var, frame)
                    203:      register struct symbol *var;
                    204:      FRAME frame;
                    205: {
                    206:   register value v;
                    207: 
                    208:   struct frame_info fi;
                    209: 
                    210:   struct type *type = SYMBOL_TYPE (var);
                    211:   register CORE_ADDR addr = 0;
                    212:   int val = SYMBOL_VALUE (var);
                    213:   register int len;
                    214: 
                    215:   v = allocate_value (type);
                    216:   VALUE_LVAL (v) = lval_memory;        /* The most likely possibility.  */
                    217:   len = TYPE_LENGTH (type);
                    218: 
                    219:   if (frame == 0) frame = selected_frame;
                    220: 
                    221:   switch (SYMBOL_CLASS (var))
                    222:     {
                    223:     case LOC_CONST:
                    224:     case LOC_LABEL:
                    225:       bcopy (&val, VALUE_CONTENTS (v), len);
                    226:       VALUE_LVAL (v) = not_lval;
                    227:       return v;
                    228: 
                    229:     case LOC_CONST_BYTES:
                    230:       bcopy (val, VALUE_CONTENTS (v), len);
                    231:       VALUE_LVAL (v) = not_lval;
                    232:       return v;
                    233: 
                    234:     case LOC_STATIC:
                    235:       addr = val;
                    236:       break;
                    237: 
                    238:     case LOC_ARG:
                    239:       fi = get_frame_info (frame);
                    240:       addr = val + FRAME_ARGS_ADDRESS (fi);
                    241:       break;
                    242: 
                    243:     case LOC_LOCAL:
                    244:       fi = get_frame_info (frame);
                    245:       addr = val + FRAME_LOCALS_ADDRESS (fi);
                    246:       break;
                    247: 
                    248:     case LOC_TYPEDEF:
                    249:       error ("Cannot look up value of a typedef");
                    250: 
                    251:     case LOC_BLOCK:
                    252:       VALUE_ADDRESS (v) = BLOCK_START (SYMBOL_BLOCK_VALUE (var));
                    253:       return v;
                    254: 
                    255:     case LOC_REGISTER:
                    256:       {
                    257:        char raw_buffer[MAX_REGISTER_RAW_SIZE];
                    258:        char virtual_buffer[MAX_REGISTER_VIRTUAL_SIZE];
                    259: 
                    260:        VALUE_REGNO (v) = val;
                    261: 
                    262:        /* Locate the register's contents in a real register or in core;
                    263:           read the data in raw format.  */
                    264: 
                    265:        addr = find_saved_register (frame, val);
                    266:        if (addr == 0)
                    267:          {
                    268:            /* Value is really in a register.  */
                    269: 
                    270:            VALUE_LVAL (v) = lval_register;
                    271:            VALUE_ADDRESS (v) = REGISTER_BYTE (val);
                    272: 
                    273:            read_register_bytes (REGISTER_BYTE (val),
                    274:                                 raw_buffer, REGISTER_RAW_SIZE (val));
                    275:          }
                    276:        else
                    277:          {
                    278:            /* Value was in a register that has been saved in memory.  */
                    279: 
                    280:            read_memory (addr, raw_buffer, REGISTER_RAW_SIZE (val));
                    281:            VALUE_ADDRESS (v) = addr;
                    282:          }
                    283: 
                    284:        /* Convert the raw contents to virtual contents.
                    285:           (Just copy them if the formats are the same.)  */
                    286: 
                    287:        REGISTER_CONVERT_TO_VIRTUAL (val, raw_buffer, virtual_buffer);
                    288: 
                    289:        if (REGISTER_CONVERTIBLE (val))
                    290:          {
                    291:            /* When the raw and virtual formats differ, the virtual format
                    292:               corresponds to a specific data type.  If we want that type,
                    293:               copy the data into the value.
                    294:               Otherwise, do a type-conversion.  */
                    295: 
                    296:            if (type != REGISTER_VIRTUAL_TYPE (val))
                    297:              {
                    298:                /* eg a variable of type `float' in a 68881 register
                    299:                   with raw type `extended' and virtual type `double'.
                    300:                   Fetch it as a `double' and then convert to `float'.  */
                    301:                v = allocate_value (REGISTER_VIRTUAL_TYPE (val));
                    302:                bcopy (virtual_buffer, VALUE_CONTENTS (v), len);
                    303:                v = value_cast (type, v);
                    304:              }
                    305:            else
                    306:              bcopy (virtual_buffer, VALUE_CONTENTS (v), len);
                    307:          }
                    308:        else
                    309:          {
                    310:            /* Raw and virtual formats are the same for this register.  */
                    311: 
                    312:            union { int i; char c; } test;
                    313:            /* If we want less than the full size, we need to
                    314:               test for a big-endian or little-endian machine.  */
                    315:            test.i = 1;
                    316:            if (test.c != 1 && len < REGISTER_RAW_SIZE (val))
                    317:              {
                    318:                /* Big-endian, and we want less than full size.  */
                    319:                VALUE_OFFSET (v) = REGISTER_RAW_SIZE (val) - len;
                    320:              }
                    321: 
                    322:            bcopy (virtual_buffer + VALUE_OFFSET (v),
                    323:                   VALUE_CONTENTS (v), len);
                    324:          }
                    325: 
                    326:        return v;
                    327:       }
                    328:     }
                    329: 
                    330:   read_memory (addr, VALUE_CONTENTS (v), len);
                    331:   VALUE_ADDRESS (v) = addr;
                    332:   return v;
                    333: }
                    334: 
                    335: /* Given a struct symbol for a variable,
                    336:    and a stack frame address,
                    337:    return a (pointer to a) struct value containing the variable's address.  */
                    338: 
                    339: value
                    340: locate_var_value (var, frame)
                    341:      register struct symbol *var;
                    342:      FRAME frame;
                    343: {
                    344:   register CORE_ADDR addr = 0;
                    345:   int val = SYMBOL_VALUE (var);
                    346:   struct frame_info fi;
                    347:   struct type *type = SYMBOL_TYPE (var);
                    348: 
                    349:   if (frame == 0) frame = selected_frame;
                    350: 
                    351:   switch (SYMBOL_CLASS (var))
                    352:     {
                    353:     case LOC_CONST:
                    354:     case LOC_CONST_BYTES:
                    355:       error ("Address requested for identifier \"%s\" which is a constant.",
                    356:             SYMBOL_NAME (var));
                    357: 
                    358:     case LOC_REGISTER:
                    359:       addr = find_saved_register (frame, val);
                    360:       if (addr != 0)
                    361:        {
                    362:          union { int i; char c; } test;
                    363:          int len = TYPE_LENGTH (type);
                    364:          /* If var is less than the full size of register, we need to
                    365:             test for a big-endian or little-endian machine.  */
                    366:          test.i = 1;
                    367:          if (test.c != 1 && len < REGISTER_RAW_SIZE (val))
                    368:            /* Big-endian, and we want less than full size.  */
                    369:            addr += REGISTER_RAW_SIZE (val) - len;
                    370:          break;
                    371:        }
                    372:       error ("Address requested for identifier \"%s\" which is in a register.",
                    373:             SYMBOL_NAME (var));
                    374: 
                    375:     case LOC_STATIC:
                    376:     case LOC_LABEL:
                    377:       addr = val;
                    378:       break;
                    379: 
                    380:     case LOC_ARG:
                    381:       fi = get_frame_info (frame);
                    382:       addr = val + FRAME_ARGS_ADDRESS (fi);
                    383:       break;
                    384: 
                    385:     case LOC_LOCAL:
                    386:       fi = get_frame_info (frame);
                    387:       addr = val + FRAME_LOCALS_ADDRESS (fi);
                    388:       break;
                    389: 
                    390:     case LOC_TYPEDEF:
                    391:       error ("Address requested for identifier \"%s\" which is a typedef.",
                    392:             SYMBOL_NAME (var));
                    393: 
                    394:     case LOC_BLOCK:
                    395:       addr = BLOCK_START (SYMBOL_BLOCK_VALUE (var));
                    396:       break;
                    397:     }
                    398: 
                    399:   return value_cast (lookup_pointer_type (type),
                    400:                     value_from_long (builtin_type_long, addr));
                    401: }
                    402: 
                    403: static
                    404: initialize ()
                    405: {}
                    406: 
                    407: END_FILE

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.