* layout.cc (Layout::add_comdat): Allow COMDAT group from a replacement
[binutils-gdb.git] / gold / dirsearch.cc
index dd1c7e6eb2c884d4cb47b6f49027741787822b9c..eb57f996fee1b84948f41946ab5809428295e76c 100644 (file)
@@ -1,6 +1,6 @@
 // dirsearch.cc -- directory searching for gold
 
-// Copyright 2006, 2007 Free Software Foundation, Inc.
+// Copyright 2006, 2007, 2008 Free Software Foundation, Inc.
 // Written by Ian Lance Taylor <iant@google.com>.
 
 // This file is part of gold.
 #include <sys/types.h>
 #include <dirent.h>
 
+#include "debug.h"
 #include "gold-threads.h"
+#include "options.h"
+#include "workqueue.h"
 #include "dirsearch.h"
 
 namespace
@@ -169,11 +172,11 @@ class Dir_cache_task : public gold::Task
     : dir_(dir), token_(token)
   { }
 
-  Is_runnable_type
-  is_runnable(gold::Workqueue*);
+  gold::Task_token*
+  is_runnable();
 
-  gold::Task_locker*
-  locks(gold::Workqueue*);
+  void
+  locks(gold::Task_locker*);
 
   void
   run(gold::Workqueue*);
@@ -189,19 +192,19 @@ class Dir_cache_task : public gold::Task
 
 // We can always run the task to read the directory.
 
-gold::Task::Is_runnable_type
-Dir_cache_task::is_runnable(gold::Workqueue*)
+gold::Task_token*
+Dir_cache_task::is_runnable()
 {
-  return IS_RUNNABLE;
+  return NULL;
 }
 
 // Return the locks to hold.  We use a blocker lock to prevent file
 // lookups from starting until the directory contents have been read.
 
-gold::Task_locker*
-Dir_cache_task::locks(gold::Workqueue* workqueue)
+void
+Dir_cache_task::locks(gold::Task_locker* tl)
 {
-  return new gold::Task_locker_block(this->token_, workqueue);
+  tl->add(this, &this->token_);
 }
 
 // Run the task--read the directory contents.
@@ -233,6 +236,9 @@ Dirsearch::initialize(Workqueue* workqueue,
     }
 }
 
+// NOTE: we only log failed file-lookup attempts here.  Successfully
+// lookups will eventually get logged in File_read::open.
+
 std::string
 Dirsearch::find(const std::string& n1, const std::string& n2,
                bool *is_in_sysroot) const
@@ -251,10 +257,20 @@ Dirsearch::find(const std::string& n1, const std::string& n2,
          *is_in_sysroot = p->is_in_sysroot();
          return p->name() + '/' + n1;
        }
-      if (!n2.empty() && pdc->find(n2))
-       {
-         *is_in_sysroot = p->is_in_sysroot();
-         return p->name() + '/' + n2;
+      else
+        gold_debug(DEBUG_FILES, "Attempt to open %s/%s failed",
+                   p->name().c_str(), n1.c_str());
+
+      if (!n2.empty())
+        {
+          if (pdc->find(n2))
+            {
+              *is_in_sysroot = p->is_in_sysroot();
+              return p->name() + '/' + n2;
+            }
+          else
+            gold_debug(DEBUG_FILES, "Attempt to open %s/%s failed",
+                       p->name().c_str(), n2.c_str());
        }
     }