]>
Commit | Line | Data |
---|---|---|
a7de96f0 | 1 | Index: gdb-7.4.50.20120602/gdb/breakpoint.c |
51a5ef0f | 2 | =================================================================== |
a7de96f0 PS |
3 | --- gdb-7.4.50.20120602.orig/gdb/breakpoint.c 2012-06-02 19:11:54.000000000 +0200 |
4 | +++ gdb-7.4.50.20120602/gdb/breakpoint.c 2012-06-02 19:52:58.161226506 +0200 | |
5 | @@ -15495,6 +15495,50 @@ initialize_breakpoint_ops (void) | |
51a5ef0f PS |
6 | } |
7 | ||
f412e1b4 | 8 | void |
51a5ef0f PS |
9 | +breakpoints_relocate (struct objfile *objfile, struct section_offsets *delta) |
10 | +{ | |
11 | + struct bp_location *bl, **blp_tmp; | |
12 | + int changed = 0; | |
13 | + | |
14 | + gdb_assert (objfile->separate_debug_objfile_backlink == NULL); | |
15 | + | |
16 | + ALL_BP_LOCATIONS (bl, blp_tmp) | |
17 | + { | |
18 | + struct obj_section *osect; | |
19 | + | |
20 | + /* BL->SECTION can be correctly NULL for breakpoints with multiple | |
21 | + locations expanded through symtab. */ | |
22 | + | |
23 | + ALL_OBJFILE_OSECTIONS (objfile, osect) | |
24 | + { | |
25 | + CORE_ADDR relocated_address; | |
26 | + CORE_ADDR delta_offset; | |
27 | + | |
28 | + delta_offset = ANOFFSET (delta, osect->the_bfd_section->index); | |
29 | + if (delta_offset == 0) | |
30 | + continue; | |
31 | + relocated_address = bl->address + delta_offset; | |
32 | + | |
33 | + if (obj_section_addr (osect) <= relocated_address | |
34 | + && relocated_address < obj_section_endaddr (osect)) | |
35 | + { | |
36 | + if (bl->inserted) | |
37 | + remove_breakpoint (bl, mark_uninserted); | |
38 | + | |
39 | + bl->address += delta_offset; | |
40 | + bl->requested_address += delta_offset; | |
41 | + | |
42 | + changed = 1; | |
43 | + } | |
44 | + } | |
45 | + } | |
46 | + | |
47 | + if (changed) | |
48 | + qsort (bp_location, bp_location_count, sizeof (*bp_location), | |
49 | + bp_location_compare); | |
50 | +} | |
51 | + | |
f412e1b4 PS |
52 | +void |
53 | _initialize_breakpoint (void) | |
54 | { | |
55 | struct cmd_list_element *c; | |
a7de96f0 | 56 | Index: gdb-7.4.50.20120602/gdb/breakpoint.h |
51a5ef0f | 57 | =================================================================== |
a7de96f0 PS |
58 | --- gdb-7.4.50.20120602.orig/gdb/breakpoint.h 2012-05-16 16:35:03.000000000 +0200 |
59 | +++ gdb-7.4.50.20120602/gdb/breakpoint.h 2012-06-02 19:53:09.268223263 +0200 | |
60 | @@ -1503,4 +1503,7 @@ extern struct gdbarch *get_sal_arch (str | |
6ed6bacf | 61 | |
a7de96f0 | 62 | extern void handle_solib_event (void); |
51a5ef0f PS |
63 | |
64 | +extern void breakpoints_relocate (struct objfile *objfile, | |
65 | + struct section_offsets *delta); | |
66 | + | |
67 | #endif /* !defined (BREAKPOINT_H) */ | |
a7de96f0 | 68 | Index: gdb-7.4.50.20120602/gdb/objfiles.c |
51a5ef0f | 69 | =================================================================== |
a7de96f0 PS |
70 | --- gdb-7.4.50.20120602.orig/gdb/objfiles.c 2012-05-10 21:50:08.000000000 +0200 |
71 | +++ gdb-7.4.50.20120602/gdb/objfiles.c 2012-06-02 19:52:58.202226502 +0200 | |
72 | @@ -802,6 +802,11 @@ objfile_relocate1 (struct objfile *objfi | |
6ed6bacf AM |
73 | objfile->sf->sym_probe_fns->sym_relocate_probe (objfile, |
74 | new_offsets, delta); | |
51a5ef0f PS |
75 | |
76 | + /* Final call of breakpoint_re_set can keep breakpoint locations disabled if | |
77 | + their addresses match. */ | |
78 | + if (objfile->separate_debug_objfile_backlink == NULL) | |
79 | + breakpoints_relocate (objfile, delta); | |
80 | + | |
81 | /* Data changed. */ | |
82 | return 1; | |
83 | } |