diff options
author | Jim Kingdon <jkingdon@engr.sgi.com> | 1993-03-26 22:49:53 +0000 |
---|---|---|
committer | Jim Kingdon <jkingdon@engr.sgi.com> | 1993-03-26 22:49:53 +0000 |
commit | 2d313932ea202abab5645f5fbeead17a27a46529 (patch) | |
tree | 2883d2a58f5d4da01b4a6e8f4d1f32491006b74c /gdb/breakpoint.c | |
parent | 030fb5cb81ca6c5dadd443007675270988d53502 (diff) | |
download | gdb-2d313932ea202abab5645f5fbeead17a27a46529.zip gdb-2d313932ea202abab5645f5fbeead17a27a46529.tar.gz gdb-2d313932ea202abab5645f5fbeead17a27a46529.tar.bz2 |
Fetch lazy values
Diffstat (limited to 'gdb/breakpoint.c')
-rw-r--r-- | gdb/breakpoint.c | 123 |
1 files changed, 66 insertions, 57 deletions
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 95e2604..b9c11d0 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -445,8 +445,8 @@ insert_breakpoints () b->enable = disabled; if (!disabled_breaks) { - fprintf_filtered (stderr, "Cannot insert breakpoint %d:\n", - b->number); + fprintf (stderr, + "Cannot insert breakpoint %d:\n", b->number); printf_filtered ("Disabling shared library breakpoints:\n"); } disabled_breaks = 1; @@ -455,11 +455,10 @@ insert_breakpoints () else #endif { - fprintf_filtered (stderr, "Cannot insert breakpoint %d:\n", - b->number); + fprintf (stderr, "Cannot insert breakpoint %d:\n", b->number); #ifdef ONE_PROCESS_WRITETEXT - fprintf_filtered (stderr, - "The same program may be running in another process.\n"); + fprintf (stderr, + "The same program may be running in another process.\n"); #endif memory_error (val, b->address); /* which bombs us out */ } @@ -479,7 +478,7 @@ remove_breakpoints () int val; #ifdef BREAKPOINT_DEBUG - printf_filtered ("Removing breakpoints.\n"); + printf ("Removing breakpoints.\n"); #endif /* BREAKPOINT_DEBUG */ ALL_BREAKPOINTS (b) @@ -490,12 +489,12 @@ remove_breakpoints () return val; b->inserted = 0; #ifdef BREAKPOINT_DEBUG - printf_filtered ("Removed breakpoint at %s", - local_hex_string(b->address)); - printf_filtered (", shadow %s", - local_hex_string(b->shadow_contents[0])); - printf_filtered (", %s.\n", - local_hex_string(b->shadow_contents[1])); + printf ("Removed breakpoint at %s", + local_hex_string(b->address)); + printf (", shadow %s", + local_hex_string(b->shadow_contents[0])); + printf (", %s.\n", + local_hex_string(b->shadow_contents[1])); #endif /* BREAKPOINT_DEBUG */ } @@ -794,7 +793,7 @@ bpstat_alloc (b, cbs) Each element of the chain refers to a particular breakpoint or watchpoint at which we have stopped. (We may have stopped for - several reasons.) + several reasons concurrently.) Each element of the chain has valid next, breakpoint_at, commands, FIXME??? fields. @@ -932,7 +931,7 @@ which its expression is valid.\n", b->number); bs->commands = b->commands; if (b->silent) this_bp_print = 0; - if (bs->commands && !strcmp ("silent", bs->commands->line)) + if (bs->commands && STREQ ("silent", bs->commands->line)) { bs->commands = bs->commands->next; this_bp_print = 0; @@ -1052,8 +1051,7 @@ breakpoint_1 (bnum, allflag) if (sym) { fputs_filtered ("in ", stdout); - fputs_demangled (SYMBOL_NAME (sym), stdout, - DMGL_ANSI | DMGL_PARAMS); + fputs_filtered (SYMBOL_SOURCE_NAME (sym), stdout); fputs_filtered (" at ", stdout); } fputs_filtered (b->symtab->filename, stdout); @@ -1142,18 +1140,17 @@ describe_other_breakpoints (pc) others++; if (others > 0) { - printf_filtered ("Note: breakpoint%s ", (others > 1) ? "s" : ""); + printf ("Note: breakpoint%s ", (others > 1) ? "s" : ""); ALL_BREAKPOINTS (b) if (b->address == pc) { others--; - printf_filtered ("%d%s%s ", - b->number, - (b->enable == disabled) ? " (disabled)" : "", - (others > 1) ? "," : - ((others == 1) ? " and" : "")); + printf ("%d%s%s ", + b->number, + (b->enable == disabled) ? " (disabled)" : "", + (others > 1) ? "," : ((others == 1) ? " and" : "")); } - printf_filtered ("also set at pc %s.\n", local_hex_string(pc)); + printf ("also set at pc %s.\n", local_hex_string(pc)); } } @@ -1256,7 +1253,7 @@ create_longjmp_breakpoint(func_name) m = lookup_minimal_symbol(func_name, (struct objfile *)NULL); if (m) - sal.pc = m->address; + sal.pc = SYMBOL_VALUE_ADDRESS (m); else return; } @@ -1552,8 +1549,8 @@ break_command_1 (arg, tempflag, from_tty) if (sals.nelts > 1) { - printf_filtered ("Multiple breakpoints were set.\n"); - printf_filtered ("Use the \"delete\" command to delete unwanted breakpoints.\n"); + printf ("Multiple breakpoints were set.\n"); + printf ("Use the \"delete\" command to delete unwanted breakpoints.\n"); } free ((PTR)sals.sals); } @@ -1614,6 +1611,8 @@ watch_command (arg, from_tty) exp_valid_block = innermost_block; val = evaluate_expression (exp); release_value (val); + if (VALUE_LAZY (val)) + value_fetch_lazy (val); /* Now set up the breakpoint. */ b = set_raw_breakpoint (sal); @@ -1771,7 +1770,7 @@ map_catch_names (args, function) goto win; } #endif - printf_filtered ("No catch clause for exception %s.\n", p); + printf ("No catch clause for exception %s.\n", p); #if 0 win: #endif @@ -1846,7 +1845,7 @@ get_catch_sals (this_level_only) for (i = 0; i < nsyms; i++) { sym = BLOCK_SYM (b, i); - if (! strcmp (SYMBOL_NAME (sym), "default")) + if (STREQ (SYMBOL_NAME (sym), "default")) { if (have_default) continue; @@ -1972,18 +1971,16 @@ catch_command_1 (arg, tempflag, from_tty) b->enable = enabled; b->disposition = tempflag ? delete : donttouch; - printf_filtered ("Breakpoint %d at %s", b->number, - local_hex_string(b->address)); + printf ("Breakpoint %d at %s", b->number, local_hex_string(b->address)); if (b->symtab) - printf_filtered (": file %s, line %d.", - b->symtab->filename, b->line_number); - printf_filtered ("\n"); + printf (": file %s, line %d.", b->symtab->filename, b->line_number); + printf ("\n"); } if (sals.nelts > 1) { - printf_filtered ("Multiple breakpoints were set.\n"); - printf_filtered ("Use the \"delete\" command to delete unwanted breakpoints.\n"); + printf ("Multiple breakpoints were set.\n"); + printf ("Use the \"delete\" command to delete unwanted breakpoints.\n"); } free ((PTR)sals.sals); } @@ -2090,11 +2087,10 @@ clear_command (arg, from_tty) } if (found->next) from_tty = 1; /* Always report if deleted more than one */ - if (from_tty) printf_filtered ("Deleted breakpoint%s ", - found->next ? "s" : ""); + if (from_tty) printf ("Deleted breakpoint%s ", found->next ? "s" : ""); while (found) { - if (from_tty) printf_filtered ("%d ", found->number); + if (from_tty) printf ("%d ", found->number); b1 = found->next; delete_breakpoint (found); found = b1; @@ -2149,7 +2145,7 @@ delete_breakpoint (bpt) free ((PTR)bpt->addr_string); if (xgdb_verbose && bpt->type == bp_breakpoint) - printf_filtered ("breakpoint #%d deleted\n", bpt->number); + printf ("breakpoint #%d deleted\n", bpt->number); /* Be sure no bpstat's are pointing at it after it's been freed. */ /* FIXME, how can we find all bpstat's? We just check stop_bpstat for now. */ @@ -2235,12 +2231,18 @@ breakpoint_re_set_one (bint) } free ((PTR)sals.sals); break; + case bp_watchpoint: - /* FIXME! This is the wrong thing to do.... */ - delete_breakpoint (b); + if (b->cond_string != NULL) + { + s = b->cond_string; + b->cond = parse_exp_1 (&s, (struct block *)0, 0); + } break; + default: printf_filtered ("Deleting unknown breakpoint type %d\n", b->type); + /* fall through */ case bp_until: case bp_finish: case bp_longjmp: @@ -2269,7 +2271,7 @@ breakpoint_re_set () ALL_BREAKPOINTS_SAFE (b, temp) { - printf_filtered (message, message1, b->number); /* Format possible error msg */ + sprintf (message, message1, b->number); /* Format possible error msg */ catch_errors (breakpoint_re_set_one, (char *) b, message); } @@ -2382,7 +2384,7 @@ map_breakpoint_numbers (args, function) function (b); goto win; } - printf_filtered ("No breakpoint number %d.\n", num); + printf ("No breakpoint number %d.\n", num); win: p = p1; } @@ -2395,7 +2397,7 @@ enable_breakpoint (bpt) bpt->enable = enabled; if (xgdb_verbose && bpt->type == bp_breakpoint) - printf_filtered ("breakpoint #%d enabled\n", bpt->number); + printf ("breakpoint #%d enabled\n", bpt->number); check_duplicates (bpt->address); if (bpt->type == bp_watchpoint) @@ -2413,6 +2415,8 @@ is valid is not currently in scope.\n", bpt->number); bpt->val = evaluate_expression (bpt->exp); release_value (bpt->val); + if (VALUE_LAZY (bpt->val)) + value_fetch_lazy (bpt->val); } } @@ -2717,21 +2721,26 @@ an expression changes."); "Synonym for ``info breakpoints''."); } -#ifdef IBM6000_TARGET -/* Where should this function go? It is used by AIX only. FIXME. */ +/* OK, when we call objfile_relocate, we need to relocate breakpoints + too. breakpoint_re_set is not a good choice--for example, if + addr_string contains just a line number without a file name the + breakpoint might get set in a different file. In general, there is + no need to go all the way back to the user's string (though this might + work if some effort were made to canonicalize it), since symtabs and + everything except addresses are still valid. -/* Breakpoint address relocation used to be done in breakpoint_re_set(). That - approach the following problem: + Probably the best way to solve this is to have each breakpoint save + the objfile and the section number that was used to set it (if set + by "*addr", probably it is best to use find_pc_line to get a symtab + and use the objfile and block_line_section for that symtab). Then + objfile_relocate can call fixup_breakpoints with the objfile and + the new_offsets, and it can relocate only the appropriate breakpoints. */ - before running the program, if a file is list, then a breakpoint is - set (just the line number), then if we switch into another file and run - the program, just a line number as a breakpoint address was not - descriptive enough and breakpoint was ending up in a different file's - similar line. +#ifdef IBM6000_TARGET +/* But for now, just kludge it based on the concept that before an + objfile is relocated the breakpoint is below 0x10000000, and afterwards + it is higher, so that way we only relocate each breakpoint once. */ - I don't think any other platform has this breakpoint relocation problem, so this - is not an issue for other platforms. */ - void fixup_breakpoints (low, high, delta) CORE_ADDR low; |