* objfiles.h (ALL_OBJSECTIONS): Handle breaks in the inner loop.
This commit is contained in:
parent
a2ae814f42
commit
96a8853a47
@ -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
|
||||
|
@ -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++)
|
||||
|
||||
/* 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) \
|
||||
ALL_OBJFILES (objfile) \
|
||||
ALL_OBJFILE_OSECTIONS (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) \
|
||||
|
Loading…
Reference in New Issue
Block a user