* objfiles.h (ALL_OBJSECTIONS): Handle breaks in the inner loop.

This commit is contained in:
Pedro Alves 2010-09-24 11:15:55 +00:00
parent a2ae814f42
commit 96a8853a47
2 changed files with 42 additions and 3 deletions

View File

@ -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>
* ada-tasks.c (read_atcb): Do not compute the task ptid when

View File

@ -611,9 +611,44 @@ extern int gdb_bfd_close_or_warn (struct bfd *abfd);
#define ALL_OBJFILE_OSECTIONS(objfile, osect) \
for (osect = objfile->sections; osect < objfile->sections_end; osect++)
#define ALL_OBJSECTIONS(objfile, osect) \
ALL_OBJFILES (objfile) \
ALL_OBJFILE_OSECTIONS (objfile, osect)
/* Traverse all obj_sections in all objfiles in the current program
space.
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) \
((objfile->sect_index_data == -1) \