From a2a5469e7999a8e4e713e11bfd191c11a422e1e8 Mon Sep 17 00:00:00 2001 From: Cary Coutant Date: Wed, 10 Mar 2010 17:37:11 +0000 Subject: * fileread.cc (File_read::~File_read): Don't delete whole_file_view_. (File_read::open[1]): Remove initial mapping of whole_file_view_. (File_read::open[2]): Add whole_file_view_ to list of views. (File_read::make_view): Remove test of whole_file_view_. (File_read::find_or_make_view): Create whole_file_view_ if necessary. (File_read::clear_views): Replace bool parameter with enum; adjust all callers. Don't delete views with permanent data; do delete cached views and views from archives if --no-keep-files-mapped is set. Set whole_file_view_ to NULL if clearing the corresponding view. * fileread.h (File_read::Clear_views_mode): New enum. (File_read::View::is_permanent_view): New method. (File_read::clear_views): Replace bool parameter with enum; adjust all callers. * options.h (General_options): Change keep_files_mapped option; add map_whole_files. * readsyms.cc (Add_symbols::run): Delete sd_ object before releasing the file. * reloc.cc (Scan_relocs::run): Delete rd_ object before releasing the file. --- gold/fileread.cc | 54 +++++++++++++++++++++++++----------------------------- 1 file changed, 25 insertions(+), 29 deletions(-) (limited to 'gold/fileread.cc') diff --git a/gold/fileread.cc b/gold/fileread.cc index 9f19099..1bfe9eb 100644 --- a/gold/fileread.cc +++ b/gold/fileread.cc @@ -115,9 +115,7 @@ File_read::~File_read() this->is_descriptor_opened_ = false; } this->name_.clear(); - this->clear_views(true); - if (this->whole_file_view_) - delete this->whole_file_view_; + this->clear_views(CLEAR_VIEWS_ALL); } // Open the file. @@ -144,23 +142,6 @@ File_read::open(const Task* task, const std::string& name) this->size_ = s.st_size; gold_debug(DEBUG_FILES, "Attempt to open %s succeeded", this->name_.c_str()); - - // Options may not yet be ready e.g. when reading a version - // script. We then default to --no-keep-files-mapped. - if (parameters->options_valid() - && parameters->options().keep_files_mapped()) - { - const unsigned char* contents = static_cast( - ::mmap(NULL, this->size_, PROT_READ, MAP_PRIVATE, - this->descriptor_, 0)); - if (contents == MAP_FAILED) - gold_fatal(_("%s: mmap failed: %s"), this->filename().c_str(), - strerror(errno)); - this->whole_file_view_ = new View(0, this->size_, contents, 0, false, - View::DATA_MMAPPED); - this->mapped_bytes_ += this->size_; - } - this->token_.add_writer(task); } @@ -180,6 +161,7 @@ File_read::open(const Task* task, const std::string& name, this->name_ = name; this->whole_file_view_ = new View(0, size, contents, 0, false, View::DATA_NOT_OWNED); + this->add_view(this->whole_file_view_); this->size_ = size; this->token_.add_writer(task); return true; @@ -226,7 +208,7 @@ File_read::release() // for releasing the descriptor. if (this->object_count_ <= 1) { - this->clear_views(false); + this->clear_views(CLEAR_VIEWS_NORMAL); if (this->is_descriptor_opened_) { release_descriptor(this->descriptor_, false); @@ -428,7 +410,7 @@ File_read::make_view(off_t start, section_size_type size, } File_read::View* v; - if (this->whole_file_view_ != NULL || byteshift != 0) + if (byteshift != 0) { unsigned char* p = new unsigned char[psize + byteshift]; memset(p, 0, byteshift); @@ -484,6 +466,15 @@ File_read::find_or_make_view(off_t offset, off_t start, byteshift = (target_size / 8) - byteshift; } + // If --map-whole-files is set, make sure we have a + // whole file view. Options may not yet be ready, e.g., + // when reading a version script. We then default to + // --no-keep-files-mapped. + if (this->whole_file_view_ == NULL + && parameters->options_valid() + && parameters->options().map_whole_files()) + this->whole_file_view_ = this->make_view(0, this->size_, 0, cache); + // Try to find a View with the required BYTESHIFT. File_read::View* vshifted; File_read::View* v = this->find_view(offset + start, size, @@ -691,25 +682,31 @@ File_read::clear_view_cache_marks() // the next object. void -File_read::clear_views(bool destroying) +File_read::clear_views(Clear_views_mode mode) { + bool keep_files_mapped = (parameters->options_valid() + && parameters->options().keep_files_mapped()); Views::iterator p = this->views_.begin(); while (p != this->views_.end()) { bool should_delete; - if (p->second->is_locked()) + if (p->second->is_locked() || p->second->is_permanent_view()) should_delete = false; - else if (destroying) + else if (mode == CLEAR_VIEWS_ALL) should_delete = true; - else if (p->second->should_cache()) + else if (p->second->should_cache() && keep_files_mapped) should_delete = false; - else if (this->object_count_ > 1 && p->second->accessed()) + else if (this->object_count_ > 1 + && p->second->accessed() + && mode != CLEAR_VIEWS_ARCHIVE) should_delete = false; else should_delete = true; if (should_delete) { + if (p->second == this->whole_file_view_) + this->whole_file_view_ = NULL; delete p->second; // map::erase invalidates only the iterator to the deleted @@ -720,7 +717,6 @@ File_read::clear_views(bool destroying) } else { - gold_assert(!destroying); p->second->clear_accessed(); ++p; } @@ -736,7 +732,7 @@ File_read::clear_views(bool destroying) } else { - gold_assert(!destroying); + gold_assert(mode != CLEAR_VIEWS_ALL); ++q; } } -- cgit v1.1