diff options
author | Ian Lance Taylor <ian@airs.com> | 2009-02-28 03:05:08 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 2009-02-28 03:05:08 +0000 |
commit | 61edd21fa41ccf31fe391ee320c4812c4d45486a (patch) | |
tree | c255bd0ec7a6fad35fcdba6b8b61760626d8fd69 /gold | |
parent | e29e076ab80ed58ab0343c9910e02df7220233f8 (diff) | |
download | gdb-61edd21fa41ccf31fe391ee320c4812c4d45486a.zip gdb-61edd21fa41ccf31fe391ee320c4812c4d45486a.tar.gz gdb-61edd21fa41ccf31fe391ee320c4812c4d45486a.tar.bz2 |
PR 5990
* descriptors.h (Open_descriptor): Add is_on_stack field.
* descriptors.cc (Descriptors::open): If the descriptor is on the
top of the stack, remove it. Initialize is_on_stack field.
(Descriptors::release): Only add pod to stack if it is not on the
stack already.
(Descriptors::close_some_descriptor): Clear stack_next and
is_on_stack fields.
Diffstat (limited to 'gold')
-rw-r--r-- | gold/ChangeLog | 9 | ||||
-rw-r--r-- | gold/descriptors.cc | 12 | ||||
-rw-r--r-- | gold/descriptors.h | 2 |
3 files changed, 22 insertions, 1 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index 5c0f9c3..dfc99b7 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,5 +1,14 @@ 2009-02-27 Ian Lance Taylor <iant@google.com> + PR 5990 + * descriptors.h (Open_descriptor): Add is_on_stack field. + * descriptors.cc (Descriptors::open): If the descriptor is on the + top of the stack, remove it. Initialize is_on_stack field. + (Descriptors::release): Only add pod to stack if it is not on the + stack already. + (Descriptors::close_some_descriptor): Clear stack_next and + is_on_stack fields. + PR 7091 * output.cc (Output_section::find_starting_output_address): Rename from starting_output_address; add PADDR parameter; change return diff --git a/gold/descriptors.cc b/gold/descriptors.cc index 18498ef..862edae 100644 --- a/gold/descriptors.cc +++ b/gold/descriptors.cc @@ -75,6 +75,12 @@ Descriptors::open(int descriptor, const char* name, int flags, int mode) { gold_assert(!pod->inuse); pod->inuse = true; + if (descriptor == this->stack_top_) + { + this->stack_top_ = pod->stack_next; + pod->stack_next = -1; + pod->is_on_stack = false; + } return descriptor; } } @@ -114,6 +120,7 @@ Descriptors::open(int descriptor, const char* name, int flags, int mode) pod->stack_next = -1; pod->inuse = true; pod->is_write = (flags & O_ACCMODE) != O_RDONLY; + pod->is_on_stack = false; ++this->current_; if (this->current_ >= this->limit_) @@ -158,10 +165,11 @@ Descriptors::release(int descriptor, bool permanent) else { pod->inuse = false; - if (!pod->is_write) + if (!pod->is_write && !pod->is_on_stack) { pod->stack_next = this->stack_top_; this->stack_top_ = descriptor; + pod->is_on_stack = true; } } } @@ -193,6 +201,8 @@ Descriptors::close_some_descriptor() this->stack_top_ = pod->stack_next; else this->open_descriptors_[last].stack_next = pod->stack_next; + pod->stack_next = -1; + pod->is_on_stack = false; return true; } last = i; diff --git a/gold/descriptors.h b/gold/descriptors.h index 1933314..44c2475 100644 --- a/gold/descriptors.h +++ b/gold/descriptors.h @@ -69,6 +69,8 @@ class Descriptors bool inuse; // Whether this is a write descriptor. bool is_write; + // Whether the descriptor is on the stack. + bool is_on_stack; }; bool |