Fix buglet in last patch.
[deliverable/binutils-gdb.git] / gold / archive.h
index 8c35d2278be50dde3e8149e6e9a102f993a975da..fb83ea629c608dd907b09a3381d4bcaf6ad22a6b 100644 (file)
@@ -31,6 +31,7 @@
 namespace gold
 {
 
+class Task;
 class Input_file;
 class Input_objects;
 class Input_group;
@@ -44,7 +45,8 @@ class Archive
 {
  public:
   Archive(const std::string& name, Input_file* input_file)
-    : name_(name), input_file_(input_file), armap_(), extended_names_()
+    : name_(name), input_file_(input_file), armap_(), armap_names_(),
+      extended_names_(), armap_checked_(), seen_offsets_()
   { }
 
   // The length of the magic string at the start of an archive.
@@ -63,7 +65,7 @@ class Archive
 
   // Set up the archive: read the symbol map.
   void
-  setup();
+  setup(Task*);
 
   // Get a reference to the underlying file.
   File_read&
@@ -72,19 +74,29 @@ class Archive
 
   // Lock the underlying file.
   void
-  lock()
-  { this->input_file_->file().lock(); }
+  lock(const Task* t)
+  { this->input_file_->file().lock(t); }
 
   // Unlock the underlying file.
   void
-  unlock()
-  { this->input_file_->file().unlock(); }
+  unlock(const Task* t)
+  { this->input_file_->file().unlock(t); }
 
   // Return whether the underlying file is locked.
   bool
   is_locked() const
   { return this->input_file_->file().is_locked(); }
 
+  // Return the token, so that the task can be queued.
+  Task_token*
+  token()
+  { return this->input_file_->file().token(); }
+
+  // Release the underlying file.
+  void
+  release()
+  { this->input_file_->file().release(); }
+
   // Select members from the archive as needed and add them to the
   // link.
   void
@@ -98,12 +110,12 @@ class Archive
 
   // Get a view into the underlying file.
   const unsigned char*
-  get_view(off_t start, off_t size, off_t* pbytes = NULL)
-  { return this->input_file_->file().get_view(start, size, pbytes); }
+  get_view(off_t start, section_size_type size, bool cache)
+  { return this->input_file_->file().get_view(start, size, cache); }
 
   // Read the archive symbol map.
   void
-  read_armap(off_t start, off_t size);
+  read_armap(off_t start, section_size_type size);
 
   // Read an archive member header at OFF.  Return the size of the
   // member, and set *PNAME to the name.
@@ -126,10 +138,10 @@ class Archive
   // An entry in the archive map of symbols to object files.
   struct Armap_entry
   {
-    // The symbol name.
-    const char* name;
-    // The offset to the file.
-    off_t offset;
+    // The offset to the symbol name in armap_names_.
+    off_t name_offset;
+    // The file offset to the object in the archive.
+    off_t file_offset;
   };
 
   // A simple hash code for off_t values.
@@ -146,6 +158,8 @@ class Archive
   Input_file* input_file_;
   // The archive map.
   std::vector<Armap_entry> armap_;
+  // The names in the archive map.
+  std::string armap_names_;
   // The extended name table.
   std::string extended_names_;
   // Track which symbols in the archive map are for elements which are
@@ -175,18 +189,24 @@ class Add_archive_symbols : public Task
 
   // The standard Task methods.
 
-  Is_runnable_type
-  is_runnable(Workqueue*);
+  Task_token*
+  is_runnable();
 
-  Task_locker*
-  locks(Workqueue*);
+  void
+  locks(Task_locker*);
 
   void
   run(Workqueue*);
 
- private:
-  class Add_archive_symbols_locker;
+  std::string
+  get_name() const
+  {
+    if (this->archive_ == NULL)
+      return "Add_archive_symbols";
+    return "Add_archive_symbols " + this->archive_->file().filename();
+  }
 
+ private:
   Symbol_table* symtab_;
   Layout* layout_;
   Input_objects* input_objects_;
This page took 0.024413 seconds and 4 git commands to generate.