mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-08-06 06:45:56 +08:00
* objfiles.h (ALL_OBJSECTIONS): Handle breaks in the inner loop.
This commit is contained in:
@ -1,3 +1,7 @@
|
|||||||
|
2010-09-24 Pedro Alves <pedro@codesourcery.com>
|
||||||
|
|
||||||
|
* objfiles.h (ALL_OBJSECTIONS): Handle breaks in the inner loop.
|
||||||
|
|
||||||
2010-09-22 Joel Brobecker <brobecker@adacore.com>
|
2010-09-22 Joel Brobecker <brobecker@adacore.com>
|
||||||
|
|
||||||
* ada-tasks.c (read_atcb): Do not compute the task ptid when
|
* ada-tasks.c (read_atcb): Do not compute the task ptid when
|
||||||
|
@ -611,9 +611,44 @@ extern int gdb_bfd_close_or_warn (struct bfd *abfd);
|
|||||||
#define ALL_OBJFILE_OSECTIONS(objfile, osect) \
|
#define ALL_OBJFILE_OSECTIONS(objfile, osect) \
|
||||||
for (osect = objfile->sections; osect < objfile->sections_end; osect++)
|
for (osect = objfile->sections; osect < objfile->sections_end; osect++)
|
||||||
|
|
||||||
#define ALL_OBJSECTIONS(objfile, osect) \
|
/* Traverse all obj_sections in all objfiles in the current program
|
||||||
ALL_OBJFILES (objfile) \
|
space.
|
||||||
ALL_OBJFILE_OSECTIONS (objfile, osect)
|
|
||||||
|
Note that this detects a "break" in the inner loop, and exits
|
||||||
|
immediately from the outer loop as well, thus, client code doesn't
|
||||||
|
need to know that this is implemented with a double for. The extra
|
||||||
|
hair is to make sure that a "break;" stops the outer loop iterating
|
||||||
|
as well, and both OBJFILE and OSECT are left unmodified:
|
||||||
|
|
||||||
|
- The outer loop learns about the inner loop's end condition, and
|
||||||
|
stops iterating if it detects the inner loop didn't reach its
|
||||||
|
end. In other words, the outer loop keeps going only if the
|
||||||
|
inner loop reached its end cleanly [(osect) ==
|
||||||
|
(objfile)->sections_end].
|
||||||
|
|
||||||
|
- OSECT is initialized in the outer loop initialization
|
||||||
|
expressions, such as if the inner loop has reached its end, so
|
||||||
|
the check mentioned above succeeds the first time.
|
||||||
|
|
||||||
|
- The trick to not clearing OBJFILE on a "break;" is, in the outer
|
||||||
|
loop's loop expression, advance OBJFILE, but iff the inner loop
|
||||||
|
reached its end. If not, there was a "break;", so leave OBJFILE
|
||||||
|
as is; the outer loop's conditional will break immediately as
|
||||||
|
well (as OSECT will be different from OBJFILE->sections_end).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define ALL_OBJSECTIONS(objfile, osect) \
|
||||||
|
for ((objfile) = current_program_space->objfiles, \
|
||||||
|
(objfile) != NULL ? ((osect) = (objfile)->sections_end) : 0; \
|
||||||
|
(objfile) != NULL \
|
||||||
|
&& (osect) == (objfile)->sections_end; \
|
||||||
|
((osect) == (objfile)->sections_end \
|
||||||
|
? ((objfile) = (objfile)->next, \
|
||||||
|
(objfile) != NULL ? (osect) = (objfile)->sections_end : 0) \
|
||||||
|
: 0)) \
|
||||||
|
for ((osect) = (objfile)->sections; \
|
||||||
|
(osect) < (objfile)->sections_end; \
|
||||||
|
(osect)++)
|
||||||
|
|
||||||
#define SECT_OFF_DATA(objfile) \
|
#define SECT_OFF_DATA(objfile) \
|
||||||
((objfile->sect_index_data == -1) \
|
((objfile->sect_index_data == -1) \
|
||||||
|
Reference in New Issue
Block a user