<div dir="ltr">This error presents a good excuse to make GetDirectory() and GetFilename() return const references :)   Having a FileSpec with a multi-component Directory but a null filename seems to me like it should be an inconsistent state, so it shouldn't be possible to set these things manually.  Instead we should have SetDirectory() and SetFilename() which do the right thing.</div>
<div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Aug 21, 2014 at 4:32 PM, Jason Molenda <span dir="ltr"><<a href="mailto:jmolenda@apple.com" target="_blank">jmolenda@apple.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Thanks, that change fixes TOT for me.  I committed the changes you recommended.<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
> On Aug 21, 2014, at 4:25 PM, Zachary Turner <<a href="mailto:zturner@google.com">zturner@google.com</a>> wrote:<br>
><br>
> Thanks.  I think I know why this happened, it was because previously GetLLDBPath() was calling GetDirectory().SetCString(), now it just calls file_spec.SetFile(), which as you mentioned does the directory / filename split.  I think the fix is in lldb-gdbserver, to call AppendPathComponent.  Can you try that and see if it fixes it?<br>

><br>
><br>
> On Thu, Aug 21, 2014 at 4:14 PM, Jason Molenda <<a href="mailto:jmolenda@apple.com">jmolenda@apple.com</a>> wrote:<br>
> Hm, I'm seeing two problems trying to build the current sources on Mac OS X.  Did you mean to have a GetFeectiveUserID method in Host or HostInfo?  I needed to do<br>
><br>
> Index: source/Host/macosx/Host.mm<br>
> ===================================================================<br>
> --- source/Host/macosx/Host.mm  (revision 216236)<br>
> +++ source/Host/macosx/Host.mm  (working copy)<br>
> @@ -1255,7 +1255,7 @@<br>
>      const char *xpc_service  = nil;<br>
>      bool send_auth = false;<br>
>      AuthorizationExternalForm extForm;<br>
> -    if ((requested_uid == UINT32_MAX) || (requested_uid == Host::GetEffectiveUserID()))<br>
> +    if ((requested_uid == UINT32_MAX) || (requested_uid == HostInfoMacOSX::GetEffectiveUserID()))<br>
>      {<br>
>          xpc_service = "com.apple.lldb.launcherXPCService";<br>
>      }<br>
> @@ -1392,7 +1392,7 @@<br>
><br>
>  #if !NO_XPC_SERVICES<br>
>      bool launchingAsRoot = launch_info.GetUserID() == 0;<br>
> -    bool currentUserIsRoot = Host::GetEffectiveUserID() == 0;<br>
> +    bool currentUserIsRoot = HostInfoMacOSX::GetEffectiveUserID() == 0;<br>
><br>
>      if (launchingAsRoot && !currentUserIsRoot)<br>
>      {<br>
><br>
> to get it to compile.<br>
><br>
> A second problem is that I can't attach/launch native processes on Mac OS X, I get<br>
><br>
> error: process launch failed: unable to locate debugserver<br>
><br>
> Previously, it looks like Host::GetLLDBPath would return a FileSpec with a directory like ".../lldb/build/Debug/LLDB.framework/Resources" and no filename.  Then in GDBRemoteCommunication.cpp it sets the filename component -<br>

><br>
>         // The debugserver binary is in the LLDB.framework/Resources<br>
>         // directory.<br>
>         if (HostInfo::GetLLDBPath(ePathTypeSupportExecutableDir, debugserver_file_spec))<br>
>         {<br>
>             debugserver_file_spec.GetFilename().SetCString(DEBUGSERVER_BASENAME);<br>
><br>
><br>
> But right now the FileSpec returned by HostInfo::GetLLDBPath has a directory of ".../lldb/build/Debug/LLDB.framework/" and a filename of "Resources" - which gets overwritten by that SetCString() method call.<br>

><br>
> I'm sure the fix is easy but I wanted to mention it on the list in case other people are also seeing this.<br>
><br>
><br>
><br>
><br>
><br>
> > On Aug 21, 2014, at 2:49 PM, Zachary Turner <<a href="mailto:zturner@google.com">zturner@google.com</a>> wrote:<br>
> ><br>
> > Author: zturner<br>
> > Date: Thu Aug 21 16:49:24 2014<br>
> > New Revision: 216230<br>
> ><br>
> > URL: <a href="http://llvm.org/viewvc/llvm-project?rev=216230&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=216230&view=rev</a><br>
> > Log:<br>
> > Move the rest of the HostInfo functions over.<br>
> ><br>
> > This should bring HostInfo up to 99% completion.  The remainder<br>
> > of code in Host will be split into instantiatable classes<br>
> > representing host processes, threads, dynamic libraries, and<br>
> > process launching strategies.<br>
> ><br>
> > Modified:<br>
> >    lldb/trunk/include/lldb/Host/Host.h<br>
> >    lldb/trunk/include/lldb/Host/freebsd/HostInfoFreeBSD.h<br>
> >    lldb/trunk/include/lldb/Host/linux/HostInfoLinux.h<br>
> >    lldb/trunk/include/lldb/Host/macosx/HostInfoMacOSX.h<br>
> >    lldb/trunk/include/lldb/Host/posix/HostInfoPosix.h<br>
> >    lldb/trunk/include/lldb/Host/windows/HostInfoWindows.h<br>
> >    lldb/trunk/source/API/SBHostOS.cpp<br>
> >    lldb/trunk/source/Host/common/Host.cpp<br>
> >    lldb/trunk/source/Host/freebsd/HostInfoFreeBSD.cpp<br>
> >    lldb/trunk/source/Host/linux/HostInfoLinux.cpp<br>
> >    lldb/trunk/source/Host/macosx/HostInfoMacOSX.mm<br>
> >    lldb/trunk/source/Host/posix/HostInfoPosix.cpp<br>
> >    lldb/trunk/source/Host/windows/Host.cpp<br>
> >    lldb/trunk/source/Host/windows/HostInfoWindows.cpp<br>
> >    lldb/trunk/source/Interpreter/CommandInterpreter.cpp<br>
> ><br>
> > Modified: lldb/trunk/include/lldb/Host/Host.h<br>
> > URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/Host.h?rev=216230&r1=216229&r2=216230&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/Host.h?rev=216230&r1=216229&r2=216230&view=diff</a><br>

> > ==============================================================================<br>
> > --- lldb/trunk/include/lldb/Host/Host.h (original)<br>
> > +++ lldb/trunk/include/lldb/Host/Host.h Thu Aug 21 16:49:24 2014<br>
> > @@ -91,25 +91,6 @@ public:<br>
> >                                  lldb::pid_t pid,<br>
> >                                  bool monitor_signals);<br>
> ><br>
> > -    static const char *<br>
> > -    GetUserName (uint32_t uid, std::string &user_name);<br>
> > -<br>
> > -    static const char *<br>
> > -    GetGroupName (uint32_t gid, std::string &group_name);<br>
> > -<br>
> > -    static uint32_t<br>
> > -    GetUserID ();<br>
> > -<br>
> > -    static uint32_t<br>
> > -    GetGroupID ();<br>
> > -<br>
> > -    static uint32_t<br>
> > -    GetEffectiveUserID ();<br>
> > -<br>
> > -    static uint32_t<br>
> > -    GetEffectiveGroupID ();<br>
> > -<br>
> > -<br>
> >     enum SystemLogType<br>
> >     {<br>
> >         eSystemLogWarning,<br>
> > @@ -261,27 +242,6 @@ public:<br>
> >     SetShortThreadName (lldb::pid_t pid, lldb::tid_t tid, const char *name, size_t len);<br>
> ><br>
> >     //------------------------------------------------------------------<br>
> > -    /// Gets the FileSpec of the user profile directory.  On Posix-platforms<br>
> > -    /// this is ~, and on windows this is generally something like<br>
> > -    /// C:\Users\Alice.<br>
> > -    ///<br>
> > -    /// @return<br>
> > -    ///     \b A file spec with the path to the user's home directory.<br>
> > -    //------------------------------------------------------------------<br>
> > -    static FileSpec<br>
> > -    GetUserProfileFileSpec ();<br>
> > -<br>
> > -    //------------------------------------------------------------------<br>
> > -    /// Gets the FileSpec of the current process (the process that<br>
> > -    /// that is running the LLDB code).<br>
> > -    ///<br>
> > -    /// @return<br>
> > -    ///     \b A file spec with the program name.<br>
> > -    //------------------------------------------------------------------<br>
> > -    static FileSpec<br>
> > -    GetProgramFileSpec ();<br>
> > -<br>
> > -    //------------------------------------------------------------------<br>
> >     /// Given an address in the current process (the process that<br>
> >     /// is running the LLDB code), return the name of the module that<br>
> >     /// it comes from. This can be useful when you need to know the<br>
> > @@ -298,8 +258,6 @@ public:<br>
> >     //------------------------------------------------------------------<br>
> >     static FileSpec<br>
> >     GetModuleFileSpecForHostAddress (const void *host_addr);<br>
> > -<br>
> > -<br>
> ><br>
> >     //------------------------------------------------------------------<br>
> >     /// If you have an executable that is in a bundle and want to get<br>
> ><br>
> > Modified: lldb/trunk/include/lldb/Host/freebsd/HostInfoFreeBSD.h<br>
> > URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/freebsd/HostInfoFreeBSD.h?rev=216230&r1=216229&r2=216230&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/freebsd/HostInfoFreeBSD.h?rev=216230&r1=216229&r2=216230&view=diff</a><br>

> > ==============================================================================<br>
> > --- lldb/trunk/include/lldb/Host/freebsd/HostInfoFreeBSD.h (original)<br>
> > +++ lldb/trunk/include/lldb/Host/freebsd/HostInfoFreeBSD.h Thu Aug 21 16:49:24 2014<br>
> > @@ -10,6 +10,7 @@<br>
> > #ifndef lldb_Host_freebsd_HostInfoFreeBSD_h_<br>
> > #define lldb_Host_freebsd_HostInfoFreeBSD_h_<br>
> ><br>
> > +#include "lldb/Host/FileSpec.h"<br>
> > #include "lldb/Host/posix/HostInfoPosix.h"<br>
> ><br>
> > namespace lldb_private<br>
> > @@ -21,6 +22,7 @@ class HostInfoFreeBSD : public HostInfoP<br>
> >     static bool GetOSVersion(uint32_t &major, uint32_t &minor, uint32_t &update);<br>
> >     static bool GetOSBuildString(std::string &s);<br>
> >     static bool GetOSKernelDescription(std::string &s);<br>
> > +    static FileSpec GetProgramFileSpec();<br>
> > };<br>
> > }<br>
> ><br>
> ><br>
> > Modified: lldb/trunk/include/lldb/Host/linux/HostInfoLinux.h<br>
> > URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/linux/HostInfoLinux.h?rev=216230&r1=216229&r2=216230&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/linux/HostInfoLinux.h?rev=216230&r1=216229&r2=216230&view=diff</a><br>

> > ==============================================================================<br>
> > --- lldb/trunk/include/lldb/Host/linux/HostInfoLinux.h (original)<br>
> > +++ lldb/trunk/include/lldb/Host/linux/HostInfoLinux.h Thu Aug 21 16:49:24 2014<br>
> > @@ -10,7 +10,9 @@<br>
> > #ifndef lldb_Host_linux_HostInfoLinux_h_<br>
> > #define lldb_Host_linux_HostInfoLinux_h_<br>
> ><br>
> > +#include "lldb/Host/FileSpec.h"<br>
> > #include "lldb/Host/posix/HostInfoPosix.h"<br>
> > +<br>
> > #include "llvm/ADT/StringRef.h"<br>
> ><br>
> > #include <string><br>
> > @@ -32,6 +34,7 @@ class HostInfoLinux : public HostInfoPos<br>
> ><br>
> >     static bool GetOSVersion(uint32_t &major, uint32_t &minor, uint32_t &update);<br>
> >     static llvm::StringRef GetDistributionId();<br>
> > +    static FileSpec GetProgramFileSpec();<br>
> ><br>
> >   protected:<br>
> >     static bool ComputeSystemPluginsDirectory(FileSpec &file_spec);<br>
> ><br>
> > Modified: lldb/trunk/include/lldb/Host/macosx/HostInfoMacOSX.h<br>
> > URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/macosx/HostInfoMacOSX.h?rev=216230&r1=216229&r2=216230&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/macosx/HostInfoMacOSX.h?rev=216230&r1=216229&r2=216230&view=diff</a><br>

> > ==============================================================================<br>
> > --- lldb/trunk/include/lldb/Host/macosx/HostInfoMacOSX.h (original)<br>
> > +++ lldb/trunk/include/lldb/Host/macosx/HostInfoMacOSX.h Thu Aug 21 16:49:24 2014<br>
> > @@ -10,6 +10,7 @@<br>
> > #ifndef lldb_Host_macosx_HostInfoMacOSX_h_<br>
> > #define lldb_Host_macosx_HostInfoMacOSX_h_<br>
> ><br>
> > +#include "lldb/Host/FileSpec.h"<br>
> > #include "lldb/Host/posix/HostInfoPosix.h"<br>
> ><br>
> > namespace lldb_private<br>
> > @@ -30,6 +31,7 @@ class HostInfoMacOSX : public HostInfoPo<br>
> >     static bool GetOSVersion(uint32_t &major, uint32_t &minor, uint32_t &update);<br>
> >     static bool GetOSBuildString(std::string &s);<br>
> >     static bool GetOSKernelDescription(std::string &s);<br>
> > +    static FileSpec GetProgramFileSpec();<br>
> ><br>
> >   protected:<br>
> >     static bool ComputeSupportExeDirectory(FileSpec &file_spec);<br>
> ><br>
> > Modified: lldb/trunk/include/lldb/Host/posix/HostInfoPosix.h<br>
> > URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/posix/HostInfoPosix.h?rev=216230&r1=216229&r2=216230&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/posix/HostInfoPosix.h?rev=216230&r1=216229&r2=216230&view=diff</a><br>

> > ==============================================================================<br>
> > --- lldb/trunk/include/lldb/Host/posix/HostInfoPosix.h (original)<br>
> > +++ lldb/trunk/include/lldb/Host/posix/HostInfoPosix.h Thu Aug 21 16:49:24 2014<br>
> > @@ -25,6 +25,11 @@ class HostInfoPosix : public HostInfoBas<br>
> >     static const char *LookupUserName(uint32_t uid, std::string &user_name);<br>
> >     static const char *LookupGroupName(uint32_t gid, std::string &group_name);<br>
> ><br>
> > +    static uint32_t GetUserID();<br>
> > +    static uint32_t GetGroupID();<br>
> > +    static uint32_t GetEffectiveUserID();<br>
> > +    static uint32_t GetEffectiveGroupID();<br>
> > +<br>
> >   protected:<br>
> >     static bool ComputeSupportExeDirectory(FileSpec &file_spec);<br>
> >     static bool ComputeHeaderDirectory(FileSpec &file_spec);<br>
> ><br>
> > Modified: lldb/trunk/include/lldb/Host/windows/HostInfoWindows.h<br>
> > URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/windows/HostInfoWindows.h?rev=216230&r1=216229&r2=216230&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/windows/HostInfoWindows.h?rev=216230&r1=216229&r2=216230&view=diff</a><br>

> > ==============================================================================<br>
> > --- lldb/trunk/include/lldb/Host/windows/HostInfoWindows.h (original)<br>
> > +++ lldb/trunk/include/lldb/Host/windows/HostInfoWindows.h Thu Aug 21 16:49:24 2014<br>
> > @@ -11,6 +11,7 @@<br>
> > #define lldb_Host_windows_HostInfoWindows_h_<br>
> ><br>
> > #include "lldb/Host/HostInfoBase.h"<br>
> > +#include "lldb/Host/FileSpec.h"<br>
> ><br>
> > namespace lldb_private<br>
> > {<br>
> > @@ -31,9 +32,13 @@ class HostInfoWindows : public HostInfoB<br>
> >     static bool GetOSBuildString(std::string &s);<br>
> >     static bool GetOSKernelDescription(std::string &s);<br>
> >     static bool GetHostname(std::string &s);<br>
> > +    static FileSpec GetProgramFileSpec();<br>
> ><br>
> >   protected:<br>
> >     static bool ComputePythonDirectory(FileSpec &file_spec);<br>
> > +<br>
> > +  private:<br>
> > +    static FileSpec m_program_filespec;<br>
> > };<br>
> > }<br>
> ><br>
> ><br>
> > Modified: lldb/trunk/source/API/SBHostOS.cpp<br>
> > URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBHostOS.cpp?rev=216230&r1=216229&r2=216230&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBHostOS.cpp?rev=216230&r1=216229&r2=216230&view=diff</a><br>

> > ==============================================================================<br>
> > --- lldb/trunk/source/API/SBHostOS.cpp (original)<br>
> > +++ lldb/trunk/source/API/SBHostOS.cpp Thu Aug 21 16:49:24 2014<br>
> > @@ -23,7 +23,7 @@ SBFileSpec<br>
> > SBHostOS::GetProgramFileSpec ()<br>
> > {<br>
> >     SBFileSpec sb_filespec;<br>
> > -    sb_filespec.SetFileSpec (Host::GetProgramFileSpec ());<br>
> > +    sb_filespec.SetFileSpec(HostInfo::GetProgramFileSpec());<br>
> >     return sb_filespec;<br>
> > }<br>
> ><br>
> ><br>
> > Modified: lldb/trunk/source/Host/common/Host.cpp<br>
> > URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/common/Host.cpp?rev=216230&r1=216229&r2=216230&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/common/Host.cpp?rev=216230&r1=216229&r2=216230&view=diff</a><br>

> > ==============================================================================<br>
> > --- lldb/trunk/source/Host/common/Host.cpp (original)<br>
> > +++ lldb/trunk/source/Host/common/Host.cpp Thu Aug 21 16:49:24 2014<br>
> > @@ -646,68 +646,6 @@ Host::SetShortThreadName (lldb::pid_t pi<br>
> ><br>
> > #endif<br>
> ><br>
> > -FileSpec<br>
> > -Host::GetUserProfileFileSpec ()<br>
> > -{<br>
> > -    static FileSpec g_profile_filespec;<br>
> > -    if (!g_profile_filespec)<br>
> > -    {<br>
> > -        llvm::SmallString<64> path;<br>
> > -        llvm::sys::path::home_directory(path);<br>
> > -        return FileSpec(path.c_str(), false);<br>
> > -    }<br>
> > -    return g_profile_filespec;<br>
> > -}<br>
> > -<br>
> > -FileSpec<br>
> > -Host::GetProgramFileSpec ()<br>
> > -{<br>
> > -    static FileSpec g_program_filespec;<br>
> > -    if (!g_program_filespec)<br>
> > -    {<br>
> > -#if defined (__APPLE__)<br>
> > -        char program_fullpath[PATH_MAX];<br>
> > -        // If DST is NULL, then return the number of bytes needed.<br>
> > -        uint32_t len = sizeof(program_fullpath);<br>
> > -        int err = _NSGetExecutablePath (program_fullpath, &len);<br>
> > -        if (err == 0)<br>
> > -            g_program_filespec.SetFile (program_fullpath, false);<br>
> > -        else if (err == -1)<br>
> > -        {<br>
> > -            char *large_program_fullpath = (char *)::malloc (len + 1);<br>
> > -<br>
> > -            err = _NSGetExecutablePath (large_program_fullpath, &len);<br>
> > -            if (err == 0)<br>
> > -                g_program_filespec.SetFile (large_program_fullpath, false);<br>
> > -<br>
> > -            ::free (large_program_fullpath);<br>
> > -        }<br>
> > -#elif defined (__linux__)<br>
> > -        char exe_path[PATH_MAX];<br>
> > -        ssize_t len = readlink("/proc/self/exe", exe_path, sizeof(exe_path) - 1);<br>
> > -        if (len > 0) {<br>
> > -            exe_path[len] = 0;<br>
> > -            g_program_filespec.SetFile(exe_path, false);<br>
> > -        }<br>
> > -#elif defined (__FreeBSD__) || defined (__FreeBSD_kernel__)<br>
> > -        int exe_path_mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, getpid() };<br>
> > -        size_t exe_path_size;<br>
> > -        if (sysctl(exe_path_mib, 4, NULL, &exe_path_size, NULL, 0) == 0)<br>
> > -        {<br>
> > -            char *exe_path = new char[exe_path_size];<br>
> > -            if (sysctl(exe_path_mib, 4, exe_path, &exe_path_size, NULL, 0) == 0)<br>
> > -                g_program_filespec.SetFile(exe_path, false);<br>
> > -            delete[] exe_path;<br>
> > -        }<br>
> > -#elif defined(_WIN32)<br>
> > -        std::vector<char> buffer(PATH_MAX);<br>
> > -        ::GetModuleFileName(NULL, &buffer[0], buffer.size());<br>
> > -        g_program_filespec.SetFile(&buffer[0], false);<br>
> > -#endif<br>
> > -    }<br>
> > -    return g_program_filespec;<br>
> > -}<br>
> > -<br>
> > #if !defined (__APPLE__) // see Host.mm<br>
> ><br>
> > bool<br>
> > @@ -864,34 +802,6 @@ Host::GetModuleFileSpecForHostAddress (c<br>
> > }<br>
> ><br>
> > #endif<br>
> > -<br>
> > -#ifndef _WIN32<br>
> > -<br>
> > -uint32_t<br>
> > -Host::GetUserID ()<br>
> > -{<br>
> > -    return getuid();<br>
> > -}<br>
> > -<br>
> > -uint32_t<br>
> > -Host::GetGroupID ()<br>
> > -{<br>
> > -    return getgid();<br>
> > -}<br>
> > -<br>
> > -uint32_t<br>
> > -Host::GetEffectiveUserID ()<br>
> > -{<br>
> > -    return geteuid();<br>
> > -}<br>
> > -<br>
> > -uint32_t<br>
> > -Host::GetEffectiveGroupID ()<br>
> > -{<br>
> > -    return getegid();<br>
> > -}<br>
> > -<br>
> > -#endif<br>
> ><br>
> > #if !defined(__linux__)<br>
> > bool<br>
> ><br>
> > Modified: lldb/trunk/source/Host/freebsd/HostInfoFreeBSD.cpp<br>
> > URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/freebsd/HostInfoFreeBSD.cpp?rev=216230&r1=216229&r2=216230&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/freebsd/HostInfoFreeBSD.cpp?rev=216230&r1=216229&r2=216230&view=diff</a><br>

> > ==============================================================================<br>
> > --- lldb/trunk/source/Host/freebsd/HostInfoFreeBSD.cpp (original)<br>
> > +++ lldb/trunk/source/Host/freebsd/HostInfoFreeBSD.cpp Thu Aug 21 16:49:24 2014<br>
> > @@ -64,3 +64,22 @@ HostInfoFreeBSD::GetOSKernelDescription(<br>
> ><br>
> >     return true;<br>
> > }<br>
> > +<br>
> > +FileSpec<br>
> > +HostInfoFreeBSD::GetProgramFileSpec()<br>
> > +{<br>
> > +    static FileSpec g_program_filespec;<br>
> > +    if (!g_program_filespec)<br>
> > +    {<br>
> > +        int exe_path_mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, getpid()};<br>
> > +        size_t exe_path_size;<br>
> > +        if (sysctl(exe_path_mib, 4, NULL, &exe_path_size, NULL, 0) == 0)<br>
> > +        {<br>
> > +            char *exe_path = new char[exe_path_size];<br>
> > +            if (sysctl(exe_path_mib, 4, exe_path, &exe_path_size, NULL, 0) == 0)<br>
> > +                g_program_filespec.SetFile(exe_path, false);<br>
> > +            delete[] exe_path;<br>
> > +        }<br>
> > +    }<br>
> > +    return g_program_filespec;<br>
> > +}<br>
> > \ No newline at end of file<br>
> ><br>
> > Modified: lldb/trunk/source/Host/linux/HostInfoLinux.cpp<br>
> > URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/linux/HostInfoLinux.cpp?rev=216230&r1=216229&r2=216230&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/linux/HostInfoLinux.cpp?rev=216230&r1=216229&r2=216230&view=diff</a><br>

> > ==============================================================================<br>
> > --- lldb/trunk/source/Host/linux/HostInfoLinux.cpp (original)<br>
> > +++ lldb/trunk/source/Host/linux/HostInfoLinux.cpp Thu Aug 21 16:49:24 2014<br>
> > @@ -172,6 +172,25 @@ HostInfoLinux::GetDistributionId()<br>
> >     return g_fields->m_distribution_id.c_str();<br>
> > }<br>
> ><br>
> > +FileSpec<br>
> > +HostInfoLinux::GetProgramFileSpec()<br>
> > +{<br>
> > +    static FileSpec g_program_filespec;<br>
> > +<br>
> > +    if (!g_program_filespec)<br>
> > +    {<br>
> > +        char exe_path[PATH_MAX];<br>
> > +        ssize_t len = readlink("/proc/self/exe", exe_path, sizeof(exe_path) - 1);<br>
> > +        if (len > 0)<br>
> > +        {<br>
> > +            exe_path[len] = 0;<br>
> > +            g_program_filespec.SetFile(exe_path, false);<br>
> > +        }<br>
> > +    }<br>
> > +<br>
> > +    return g_program_filespec;<br>
> > +}<br>
> > +<br>
> > bool<br>
> > HostInfoLinux::ComputeSystemPluginsDirectory(FileSpec &file_spec)<br>
> > {<br>
> ><br>
> > Modified: lldb/trunk/source/Host/macosx/HostInfoMacOSX.mm<br>
> > URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/macosx/HostInfoMacOSX.mm?rev=216230&r1=216229&r2=216230&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/macosx/HostInfoMacOSX.mm?rev=216230&r1=216229&r2=216230&view=diff</a><br>

> > ==============================================================================<br>
> > --- lldb/trunk/source/Host/macosx/HostInfoMacOSX.mm (original)<br>
> > +++ lldb/trunk/source/Host/macosx/HostInfoMacOSX.mm Thu Aug 21 16:49:24 2014<br>
> > @@ -27,6 +27,7 @@<br>
> > // Objective C/C++ includes<br>
> > #include <CoreFoundation/CoreFoundation.h><br>
> > #include <Foundation/Foundation.h><br>
> > +#include <mach-o/dyld.h><br>
> > #include <objc/objc-auto.h><br>
> ><br>
> > using namespace lldb_private;<br>
> > @@ -91,6 +92,32 @@ HostInfoMacOSX::GetOSVersion(uint32_t &m<br>
> >     return false;<br>
> > }<br>
> ><br>
> > +FileSpec<br>
> > +HostInfoMacOSX::GetProgramFileSpec()<br>
> > +{<br>
> > +    static FileSpec g_program_filespec;<br>
> > +    if (!g_program_filespec)<br>
> > +    {<br>
> > +        char program_fullpath[PATH_MAX];<br>
> > +        // If DST is NULL, then return the number of bytes needed.<br>
> > +        uint32_t len = sizeof(program_fullpath);<br>
> > +        int err = _NSGetExecutablePath(program_fullpath, &len);<br>
> > +        if (err == 0)<br>
> > +            g_program_filespec.SetFile(program_fullpath, false);<br>
> > +        else if (err == -1)<br>
> > +        {<br>
> > +            char *large_program_fullpath = (char *)::malloc(len + 1);<br>
> > +<br>
> > +            err = _NSGetExecutablePath(large_program_fullpath, &len);<br>
> > +            if (err == 0)<br>
> > +                g_program_filespec.SetFile(large_program_fullpath, false);<br>
> > +<br>
> > +            ::free(large_program_fullpath);<br>
> > +        }<br>
> > +    }<br>
> > +    return g_program_filespec;<br>
> > +}<br>
> > +<br>
> > bool<br>
> > HostInfoMacOSX::ComputeSupportExeDirectory(FileSpec &file_spec)<br>
> > {<br>
> ><br>
> > Modified: lldb/trunk/source/Host/posix/HostInfoPosix.cpp<br>
> > URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/posix/HostInfoPosix.cpp?rev=216230&r1=216229&r2=216230&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/posix/HostInfoPosix.cpp?rev=216230&r1=216229&r2=216230&view=diff</a><br>

> > ==============================================================================<br>
> > --- lldb/trunk/source/Host/posix/HostInfoPosix.cpp (original)<br>
> > +++ lldb/trunk/source/Host/posix/HostInfoPosix.cpp Thu Aug 21 16:49:24 2014<br>
> > @@ -97,6 +97,30 @@ HostInfoPosix::LookupGroupName(uint32_t<br>
> >     return NULL;<br>
> > }<br>
> ><br>
> > +uint32_t<br>
> > +HostInfoPosix::GetUserID()<br>
> > +{<br>
> > +    return getuid();<br>
> > +}<br>
> > +<br>
> > +uint32_t<br>
> > +HostInfoPosix::GetGroupID()<br>
> > +{<br>
> > +    return getgid();<br>
> > +}<br>
> > +<br>
> > +uint32_t<br>
> > +HostInfoPosix::GetEffectiveUserID()<br>
> > +{<br>
> > +    return geteuid();<br>
> > +}<br>
> > +<br>
> > +uint32_t<br>
> > +HostInfoPosix::GetEffectiveGroupID()<br>
> > +{<br>
> > +    return getegid();<br>
> > +}<br>
> > +<br>
> > bool<br>
> > HostInfoPosix::ComputeSupportExeDirectory(FileSpec &file_spec)<br>
> > {<br>
> ><br>
> > Modified: lldb/trunk/source/Host/windows/Host.cpp<br>
> > URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/windows/Host.cpp?rev=216230&r1=216229&r2=216230&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/windows/Host.cpp?rev=216230&r1=216229&r2=216230&view=diff</a><br>

> > ==============================================================================<br>
> > --- lldb/trunk/source/Host/windows/Host.cpp (original)<br>
> > +++ lldb/trunk/source/Host/windows/Host.cpp Thu Aug 21 16:49:24 2014<br>
> > @@ -236,33 +236,6 @@ Host::DynamicLibraryGetSymbol(void *opaq<br>
> > }<br>
> ><br>
> > uint32_t<br>
> > -Host::GetUserID ()<br>
> > -{<br>
> > -    llvm_unreachable("Windows does not support uid");<br>
> > -}<br>
> > -<br>
> > -uint32_t<br>
> > -Host::GetGroupID ()<br>
> > -{<br>
> > -    llvm_unreachable("Windows does not support gid");<br>
> > -    return 0;<br>
> > -}<br>
> > -<br>
> > -uint32_t<br>
> > -Host::GetEffectiveUserID ()<br>
> > -{<br>
> > -    llvm_unreachable("Windows does not support euid");<br>
> > -    return 0;<br>
> > -}<br>
> > -<br>
> > -uint32_t<br>
> > -Host::GetEffectiveGroupID ()<br>
> > -{<br>
> > -    llvm_unreachable("Windows does not support egid");<br>
> > -    return 0;<br>
> > -}<br>
> > -<br>
> > -uint32_t<br>
> > Host::FindProcesses (const ProcessInstanceInfoMatch &match_info, ProcessInstanceInfoList &process_infos)<br>
> > {<br>
> >     process_infos.Clear();<br>
> ><br>
> > Modified: lldb/trunk/source/Host/windows/HostInfoWindows.cpp<br>
> > URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/windows/HostInfoWindows.cpp?rev=216230&r1=216229&r2=216230&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/windows/HostInfoWindows.cpp?rev=216230&r1=216229&r2=216230&view=diff</a><br>

> > ==============================================================================<br>
> > --- lldb/trunk/source/Host/windows/HostInfoWindows.cpp (original)<br>
> > +++ lldb/trunk/source/Host/windows/HostInfoWindows.cpp Thu Aug 21 16:49:24 2014<br>
> > @@ -15,6 +15,8 @@<br>
> ><br>
> > using namespace lldb_private;<br>
> ><br>
> > +FileSpec HostInfoWindows::m_program_filespec;<br>
> > +<br>
> > size_t<br>
> > HostInfoWindows::GetPageSize()<br>
> > {<br>
> > @@ -79,6 +81,21 @@ HostInfoWindows::GetHostname(std::string<br>
> >     return true;<br>
> > }<br>
> ><br>
> > +FileSpec<br>
> > +HostInfoWindows::GetProgramFileSpec()<br>
> > +{<br>
> > +    static bool is_initialized = false;<br>
> > +    if (!is_initialized)<br>
> > +    {<br>
> > +        is_initialized = true;<br>
> > +<br>
> > +        std::vector<char> buffer(PATH_MAX);<br>
> > +        ::GetModuleFileName(NULL, &buffer[0], buffer.size());<br>
> > +        m_program_filespec.SetFile(&buffer[0], false);<br>
> > +    }<br>
> > +    return m_program_filespec;<br>
> > +}<br>
> > +<br>
> > bool<br>
> > HostInfoWindows::ComputePythonDirectory(FileSpec &file_spec)<br>
> > {<br>
> ><br>
> > Modified: lldb/trunk/source/Interpreter/CommandInterpreter.cpp<br>
> > URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/CommandInterpreter.cpp?rev=216230&r1=216229&r2=216230&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/CommandInterpreter.cpp?rev=216230&r1=216229&r2=216230&view=diff</a><br>

> > ==============================================================================<br>
> > --- lldb/trunk/source/Interpreter/CommandInterpreter.cpp (original)<br>
> > +++ lldb/trunk/source/Interpreter/CommandInterpreter.cpp Thu Aug 21 16:49:24 2014<br>
> > @@ -51,6 +51,7 @@<br>
> ><br>
> > #include "lldb/Host/Editline.h"<br>
> > #include "lldb/Host/Host.h"<br>
> > +#include "lldb/Host/HostInfo.h"<br>
> ><br>
> > #include "lldb/Interpreter/Args.h"<br>
> > #include "lldb/Interpreter/CommandCompletions.h"<br>
> > @@ -67,7 +68,9 @@<br>
> ><br>
> > #include "lldb/Utility/CleanUp.h"<br>
> ><br>
> > +#include "llvm/ADT/SmallString.h"<br>
> > #include "llvm/ADT/STLExtras.h"<br>
> > +#include "llvm/Support/Path.h"<br>
> ><br>
> > using namespace lldb;<br>
> > using namespace lldb_private;<br>
> > @@ -2381,13 +2384,15 @@ CommandInterpreter::SourceInitFile (bool<br>
> >         // "-" and the name of the program. If this file doesn't exist, we fall<br>
> >         // back to just the "~/.lldbinit" file. We also obey any requests to not<br>
> >         // load the init files.<br>
> > -        FileSpec profilePath = Host::GetUserProfileFileSpec();<br>
> > +        llvm::SmallString<64> home_dir_path;<br>
> > +        llvm::sys::path::home_directory(home_dir_path);<br>
> > +        FileSpec profilePath(home_dir_path.c_str(), false);<br>
> >         profilePath.AppendPathComponent(".lldbinit");<br>
> >         std::string init_file_path = profilePath.GetPath();<br>
> ><br>
> >         if (m_skip_app_init_files == false)<br>
> >         {<br>
> > -            FileSpec program_file_spec (Host::GetProgramFileSpec());<br>
> > +            FileSpec program_file_spec(HostInfo::GetProgramFileSpec());<br>
> >             const char *program_name = program_file_spec.GetFilename().AsCString();<br>
> ><br>
> >             if (program_name)<br>
> ><br>
> ><br>
> > _______________________________________________<br>
> > lldb-commits mailing list<br>
> > <a href="mailto:lldb-commits@cs.uiuc.edu">lldb-commits@cs.uiuc.edu</a><br>
> > <a href="http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits</a><br>
><br>
><br>
<br>
</div></div></blockquote></div><br></div>