diff options
author | Pedro Alves <palves@redhat.com> | 2010-09-24 11:15:55 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2010-09-24 11:15:55 +0000 |
commit | 96a8853a477148534aa29ba97c791f3f23e55452 (patch) | |
tree | 6d84875ae2f6d6360996900d37f733613cb1d65f /gdb/objfiles.h | |
parent | a2ae814f42b5b83b82c38e5d2f9f41447d4a247e (diff) | |
download | binutils-gdb-96a8853a477148534aa29ba97c791f3f23e55452.tar.gz |
* objfiles.h (ALL_OBJSECTIONS): Handle breaks in the inner loop.
Diffstat (limited to 'gdb/objfiles.h')
-rw-r--r-- | gdb/objfiles.h | 41 |
1 files changed, 38 insertions, 3 deletions
diff --git a/gdb/objfiles.h b/gdb/objfiles.h index b3e2e26faac..8b47d2bbfaf 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -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) \ |