[Lldb-commits] [lldb] r113575 - in /lldb/trunk: include/lldb/API/SBFileSpec.h include/lldb/Core/FileSpec.h include/lldb/Host/Host.h source/API/SBFileSpec.cpp source/Commands/CommandObjectFile.cpp source/Core/FileSpec.cpp source/Host/common/Host.cpp source/Target/TargetList.cpp tools/driver/Driver.cpp

Caroline Tice ctice at apple.com
Thu Sep 9 21:48:56 PDT 2010


Author: ctice
Date: Thu Sep  9 23:48:55 2010
New Revision: 113575

URL: http://llvm.org/viewvc/llvm-project?rev=113575&view=rev
Log:
If the file the user specifies can't be found in the current directory,
and the user didn't specify a particular directory, search for the file 
using the $PATH environment variable.


Modified:
    lldb/trunk/include/lldb/API/SBFileSpec.h
    lldb/trunk/include/lldb/Core/FileSpec.h
    lldb/trunk/include/lldb/Host/Host.h
    lldb/trunk/source/API/SBFileSpec.cpp
    lldb/trunk/source/Commands/CommandObjectFile.cpp
    lldb/trunk/source/Core/FileSpec.cpp
    lldb/trunk/source/Host/common/Host.cpp
    lldb/trunk/source/Target/TargetList.cpp
    lldb/trunk/tools/driver/Driver.cpp

Modified: lldb/trunk/include/lldb/API/SBFileSpec.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBFileSpec.h?rev=113575&r1=113574&r2=113575&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBFileSpec.h (original)
+++ lldb/trunk/include/lldb/API/SBFileSpec.h Thu Sep  9 23:48:55 2010
@@ -36,6 +36,9 @@
     bool
     Exists () const;
 
+    bool
+    ResolveExecutableLocation ();
+
     const char *
     GetFilename() const;
 

Modified: lldb/trunk/include/lldb/Core/FileSpec.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/FileSpec.h?rev=113575&r1=113574&r2=113575&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/FileSpec.h (original)
+++ lldb/trunk/include/lldb/Core/FileSpec.h Thu Sep  9 23:48:55 2010
@@ -261,6 +261,21 @@
     bool
     Exists () const;
 
+     
+    //------------------------------------------------------------------
+    /// Expanded existence test.
+    ///
+    /// Call into the Host to see if it can help find the file (e.g. by
+    /// searching paths set in the environment, etc.).
+    ///
+    /// If found, sets the value of m_directory to the directory where the file was found.
+    ///
+    /// @return
+    ///     \b true if was able to find the file using expanded search methods, \b false otherwise.
+    //------------------------------------------------------------------
+    bool
+    ResolveExecutableLocation ();
+
     uint64_t
     GetByteSize() const;
 

Modified: lldb/trunk/include/lldb/Host/Host.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/Host.h?rev=113575&r1=113574&r2=113575&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Host/Host.h (original)
+++ lldb/trunk/include/lldb/Host/Host.h Thu Sep  9 23:48:55 2010
@@ -258,6 +258,9 @@
 
     static bool
     ResolveExecutableInBundle (FileSpec *file);
+
+    static bool
+    ResolveExecutableLocation (ConstString &directory_name, const ConstString &filename);
     
     static uint32_t
     ListProcessesMatchingName (const char *name, StringList &matches, std::vector<lldb::pid_t> &pids);

Modified: lldb/trunk/source/API/SBFileSpec.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBFileSpec.cpp?rev=113575&r1=113574&r2=113575&view=diff
==============================================================================
--- lldb/trunk/source/API/SBFileSpec.cpp (original)
+++ lldb/trunk/source/API/SBFileSpec.cpp Thu Sep  9 23:48:55 2010
@@ -61,6 +61,13 @@
     return false;
 }
 
+bool
+SBFileSpec::ResolveExecutableLocation ()
+{
+    if (m_opaque_ap.get())
+        return m_opaque_ap->ResolveExecutableLocation ();
+    return false;
+}
 
 int
 SBFileSpec::ResolvePath (const char *src_path, char *dst_path, size_t dst_len)

Modified: lldb/trunk/source/Commands/CommandObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectFile.cpp?rev=113575&r1=113574&r2=113575&view=diff
==============================================================================
--- lldb/trunk/source/Commands/CommandObjectFile.cpp (original)
+++ lldb/trunk/source/Commands/CommandObjectFile.cpp Thu Sep  9 23:48:55 2010
@@ -117,7 +117,7 @@
     {
         FileSpec file_spec (file_path);
 
-        if (! file_spec.Exists())
+        if (! file_spec.Exists() && !file_spec.ResolveExecutableLocation())
         {
             result.AppendErrorWithFormat ("File '%s' does not exist.\n", file_path);
             result.SetStatus (eReturnStatusFailed);

Modified: lldb/trunk/source/Core/FileSpec.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/FileSpec.cpp?rev=113575&r1=113574&r2=113575&view=diff
==============================================================================
--- lldb/trunk/source/Core/FileSpec.cpp (original)
+++ lldb/trunk/source/Core/FileSpec.cpp Thu Sep  9 23:48:55 2010
@@ -22,6 +22,7 @@
 #include "lldb/Core/DataBufferHeap.h"
 #include "lldb/Core/DataBufferMemoryMap.h"
 #include "lldb/Core/Stream.h"
+#include "lldb/Host/Host.h"
 
 using namespace lldb;
 using namespace lldb_private;
@@ -414,6 +415,12 @@
     return GetFileStats (this, &file_stats);
 }
 
+bool
+FileSpec::ResolveExecutableLocation ()
+{
+    return Host::ResolveExecutableLocation (m_directory, m_filename);
+}
+
 uint64_t
 FileSpec::GetByteSize() const
 {

Modified: lldb/trunk/source/Host/common/Host.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/common/Host.cpp?rev=113575&r1=113574&r2=113575&view=diff
==============================================================================
--- lldb/trunk/source/Host/common/Host.cpp (original)
+++ lldb/trunk/source/Host/common/Host.cpp Thu Sep  9 23:48:55 2010
@@ -727,3 +727,59 @@
     return false;
 }
 #endif
+
+bool
+Host::ResolveExecutableLocation (ConstString &directory_name, const ConstString &filename)
+{
+    // If the user specified just a plain filename, there may be additional ways to find the
+    // file, such as searching the PATH environment variable on UNIX systems.  This is the location
+    // to implement such additional searches.
+
+    // For now the only search we are implementing is search $PATH, which makes no sense if
+    // the user already specified a directory.
+
+    if (directory_name.GetLength() > 0)
+        return false;
+
+    std::string search_path (getenv ("PATH"));
+    char dir_separator = ':';
+
+    bool done = false;
+    bool found = false;
+    size_t start = 0;
+    while (!done && !found)
+    {
+        size_t end = search_path.find (dir_separator, start);
+        size_t length;
+        if (end == std::string::npos)
+        {
+            done = true;
+            length = search_path.length() - start;
+        }
+        else
+            length = end - start;
+
+        std::string directory_str = search_path.substr (start, length);
+
+        if (directory_str.length() > 0)
+        {
+            StreamString tmp_full_path_name;
+            if (directory_str[directory_str.length()-1] == '/')
+                tmp_full_path_name.Printf ("%s%s", directory_str.c_str(), filename.AsCString());
+            else
+                tmp_full_path_name.Printf ("%s/%s", directory_str.c_str(), filename.AsCString());
+
+            struct stat sb;
+
+            if (::stat (tmp_full_path_name.GetData(), &sb) == 0)
+            {
+                found = true;
+                directory_name.SetCString (directory_str.c_str());
+            }
+        }
+            
+        if (!done)
+          start = end + 1;
+    }
+    return found;
+}

Modified: lldb/trunk/source/Target/TargetList.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/TargetList.cpp?rev=113575&r1=113574&r2=113575&view=diff
==============================================================================
--- lldb/trunk/source/Target/TargetList.cpp (original)
+++ lldb/trunk/source/Target/TargetList.cpp Thu Sep  9 23:48:55 2010
@@ -71,6 +71,10 @@
     {
         ModuleSP exe_module_sp;
         FileSpec resolved_file(file);
+        
+        if (!resolved_file.Exists())
+            resolved_file.ResolveExecutableLocation ();
+            
         if (!Host::ResolveExecutableInBundle (&resolved_file))
             resolved_file = file;
 

Modified: lldb/trunk/tools/driver/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/driver/Driver.cpp?rev=113575&r1=113574&r2=113575&view=diff
==============================================================================
--- lldb/trunk/tools/driver/Driver.cpp (original)
+++ lldb/trunk/tools/driver/Driver.cpp Thu Sep  9 23:48:55 2010
@@ -527,6 +527,13 @@
                             SBFileSpec file(optarg);
                             if (file.Exists())
                                 m_option_data.m_filename = optarg;
+                            else if (file.ResolveExecutableLocation())
+                            {
+                                char path[PATH_MAX];
+                                int path_len;
+                                file.GetPath (path, path_len);
+                                m_option_data.m_filename = path;
+                            }
                             else
                                 error.SetErrorStringWithFormat("file specified in --file (-f) option doesn't exist: '%s'", optarg);
                         }
@@ -550,6 +557,14 @@
                             SBFileSpec file(optarg);
                             if (file.Exists())
                                 m_option_data.m_source_command_files.push_back (optarg);
+                            else if (file.ResolveExecutableLocation())
+                            {
+                                char final_path[PATH_MAX];
+                                size_t path_len;
+                                file.GetPath (final_path, path_len);
+                                std::string path_str (final_path);
+                                m_option_data.m_source_command_files.push_back (path_str);
+                            }
                             else
                                 error.SetErrorStringWithFormat("file specified in --source (-s) option doesn't exist: '%s'", optarg);
                         }





More information about the lldb-commits mailing list