[llvm] r183996 - Replace use of PathV1.h in Program.cpp.
Manuel Klimek
klimek at google.com
Mon Jun 17 03:51:11 PDT 2013
On Fri, Jun 14, 2013 at 9:38 PM, Rafael Espindola <
rafael.espindola at gmail.com> wrote:
> Author: rafael
> Date: Fri Jun 14 14:38:45 2013
> New Revision: 183996
>
> URL: http://llvm.org/viewvc/llvm-project?rev=183996&view=rev
> Log:
> Replace use of PathV1.h in Program.cpp.
>
> Modified:
> llvm/trunk/include/llvm/Support/FileSystem.h
> llvm/trunk/lib/Support/Program.cpp
> llvm/trunk/lib/Support/Unix/PathV2.inc
> llvm/trunk/lib/Support/Unix/Program.inc
> llvm/trunk/lib/Support/Windows/PathV2.inc
> llvm/trunk/lib/Support/Windows/Program.inc
>
> Modified: llvm/trunk/include/llvm/Support/FileSystem.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/FileSystem.h?rev=183996&r1=183995&r2=183996&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/FileSystem.h (original)
> +++ llvm/trunk/include/llvm/Support/FileSystem.h Fri Jun 14 14:38:45 2013
> @@ -342,6 +342,12 @@ inline bool exists(const Twine &path) {
> return !exists(path, result) && result;
> }
>
> +/// @brief Can we execute this file?
> +///
> +/// @param Path Input path.
> +/// @returns True if we can execute it, false otherwise.
> +bool can_execute(const Twine &Path);
> +
> /// @brief Do file_status's represent the same thing?
> ///
> /// @param A Input file_status.
>
> Modified: llvm/trunk/lib/Support/Program.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Program.cpp?rev=183996&r1=183995&r2=183996&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Support/Program.cpp (original)
> +++ llvm/trunk/lib/Support/Program.cpp Fri Jun 14 14:38:45 2013
> @@ -12,7 +12,6 @@
>
> //===----------------------------------------------------------------------===//
>
> #include "llvm/Support/Program.h"
> -#include "llvm/Support/PathV1.h"
> #include "llvm/Config/config.h"
> #include "llvm/Support/system_error.h"
> using namespace llvm;
> @@ -23,39 +22,12 @@ using namespace sys;
> //=== independent code.
>
> //===----------------------------------------------------------------------===//
>
> -static bool Execute(void **Data, const Path &path, const char **args,
> - const char **env, const sys::Path **redirects,
> - unsigned memoryLimit, std::string *ErrMsg);
> -
> -static int Wait(void *&Data, const Path &path, unsigned secondsToWait,
> - std::string *ErrMsg);
> -
> -
> static bool Execute(void **Data, StringRef Program, const char **args,
> const char **env, const StringRef **Redirects,
> - unsigned memoryLimit, std::string *ErrMsg) {
> - Path P(Program);
> - if (!Redirects)
> - return Execute(Data, P, args, env, 0, memoryLimit, ErrMsg);
> - Path IO[3];
> - const Path *IOP[3];
> - for (int I = 0; I < 3; ++I) {
> - if (Redirects[I]) {
> - IO[I] = *Redirects[I];
> - IOP[I] = &IO[I];
> - } else {
> - IOP[I] = 0;
> - }
> - }
> -
> - return Execute(Data, P, args, env, IOP, memoryLimit, ErrMsg);
> -}
> + unsigned memoryLimit, std::string *ErrMsg);
>
> static int Wait(void *&Data, StringRef Program, unsigned secondsToWait,
> - std::string *ErrMsg) {
> - Path P(Program);
> - return Wait(Data, P, secondsToWait, ErrMsg);
> -}
> + std::string *ErrMsg);
>
> int sys::ExecuteAndWait(StringRef Program, const char **args, const char
> **envp,
> const StringRef **redirects, unsigned
> secondsToWait,
>
> Modified: llvm/trunk/lib/Support/Unix/PathV2.inc
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/PathV2.inc?rev=183996&r1=183995&r2=183996&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Support/Unix/PathV2.inc (original)
> +++ llvm/trunk/lib/Support/Unix/PathV2.inc Fri Jun 14 14:38:45 2013
> @@ -292,6 +292,13 @@ error_code exists(const Twine &path, boo
> return error_code::success();
> }
>
> +bool can_execute(const Twine &Path) {
> + SmallString<128> PathStorage;
> + StringRef P = Path.toNullTerminatedStringRef(PathStorage);
> +
> + return ::access(P.begin(), X_OK) != -1;
>
This regressed from PathV1. I fixed that in r184074 - let me know if you
see problems there...
> +}
> +
> bool equivalent(file_status A, file_status B) {
> assert(status_known(A) && status_known(B));
> return A.fs_st_dev == B.fs_st_dev &&
>
> Modified: llvm/trunk/lib/Support/Unix/Program.inc
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Program.inc?rev=183996&r1=183995&r2=183996&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Support/Unix/Program.inc (original)
> +++ llvm/trunk/lib/Support/Unix/Program.inc Fri Jun 14 14:38:45 2013
> @@ -54,13 +54,11 @@ sys::FindProgramByName(const std::string
> // Check some degenerate cases
> if (progName.length() == 0) // no program
> return "";
> - Path temp;
> - if (!temp.set(progName)) // invalid name
> - return "";
> + std::string temp = progName;
> // Use the given path verbatim if it contains any slashes; this matches
> // the behavior of sh(1) and friends.
> if (progName.find('/') != std::string::npos)
> - return temp.str();
> + return temp;
>
> // At this point, the file name is valid and does not contain slashes.
> Search
> // for it through the directories specified in the PATH environment
> variable.
> @@ -77,12 +75,10 @@ sys::FindProgramByName(const std::string
> const char *Colon = std::find(PathStr, PathStr+PathLen, ':');
>
> // Check to see if this first directory contains the executable...
> - Path FilePath;
> - if (FilePath.set(std::string(PathStr,Colon))) {
> - FilePath.appendComponent(progName);
> - if (FilePath.canExecute())
> - return FilePath.str(); // Found the executable!
> - }
> + SmallString<128> FilePath(PathStr,Colon);
> + sys::path::append(FilePath, progName);
> + if (sys::fs::can_execute(Twine(FilePath)))
> + return FilePath.str(); // Found the executable!
>
> // Nope it wasn't in this directory, check the next path in the list!
> PathLen -= Colon-PathStr;
> @@ -97,20 +93,20 @@ sys::FindProgramByName(const std::string
> return "";
> }
>
> -static bool RedirectIO(const Path *Path, int FD, std::string* ErrMsg) {
> +static bool RedirectIO(const StringRef *Path, int FD, std::string*
> ErrMsg) {
> if (Path == 0) // Noop
> return false;
> - const char *File;
> - if (Path->isEmpty())
> + std::string File;
> + if (Path->empty())
> // Redirect empty paths to /dev/null
> File = "/dev/null";
> else
> - File = Path->c_str();
> + File = *Path;
>
> // Open the file
> - int InFD = open(File, FD == 0 ? O_RDONLY : O_WRONLY|O_CREAT, 0666);
> + int InFD = open(File.c_str(), FD == 0 ? O_RDONLY : O_WRONLY|O_CREAT,
> 0666);
> if (InFD == -1) {
> - MakeErrMsg(ErrMsg, "Cannot open file '" + std::string(File) + "' for "
> + MakeErrMsg(ErrMsg, "Cannot open file '" + File + "' for "
> + (FD == 0 ? "input" : "output"));
> return true;
> }
> @@ -126,19 +122,20 @@ static bool RedirectIO(const Path *Path,
> }
>
> #ifdef HAVE_POSIX_SPAWN
> -static bool RedirectIO_PS(const Path *Path, int FD, std::string *ErrMsg,
> +static bool RedirectIO_PS(const StringRef *Path, int FD, std::string
> *ErrMsg,
> posix_spawn_file_actions_t *FileActions) {
> if (Path == 0) // Noop
> return false;
> - const char *File;
> - if (Path->isEmpty())
> + std::string File;
> + if (Path->empty())
> // Redirect empty paths to /dev/null
> File = "/dev/null";
> else
> - File = Path->c_str();
> + File = *Path;
>
> - if (int Err = posix_spawn_file_actions_addopen(FileActions, FD,
> - File, FD == 0 ? O_RDONLY : O_WRONLY|O_CREAT,
> 0666))
> + if (int Err = posix_spawn_file_actions_addopen(
> + FileActions, FD, File.c_str(),
> + FD == 0 ? O_RDONLY : O_WRONLY | O_CREAT, 0666))
> return MakeErrMsg(ErrMsg, "Cannot dup2", Err);
> return false;
> }
> @@ -178,8 +175,8 @@ static void SetMemoryLimits (unsigned si
>
> }
>
> -static bool Execute(void **Data, const Path &path, const char **args,
> - const char **envp, const Path **redirects,
> +static bool Execute(void **Data, StringRef Program, const char **args,
> + const char **envp, const StringRef **redirects,
> unsigned memoryLimit, std::string *ErrMsg) {
> // If this OS has posix_spawn and there is no memory limit being
> implied, use
> // posix_spawn. It is more efficient than fork/exec.
> @@ -219,7 +216,7 @@ static bool Execute(void **Data, const P
> // Explicitly initialized to prevent what appears to be a valgrind
> false
> // positive.
> pid_t PID = 0;
> - int Err = posix_spawn(&PID, path.c_str(), FileActions, /*attrp*/0,
> + int Err = posix_spawn(&PID, Program.str().c_str(), FileActions,
> /*attrp*/0,
> const_cast<char **>(args), const_cast<char
> **>(envp));
>
> if (FileActions)
> @@ -270,12 +267,13 @@ static bool Execute(void **Data, const P
> }
>
> // Execute!
> + std::string PathStr = Program;
> if (envp != 0)
> - execve(path.c_str(),
> + execve(PathStr.c_str(),
> const_cast<char **>(args),
> const_cast<char **>(envp));
> else
> - execv(path.c_str(),
> + execv(PathStr.c_str(),
> const_cast<char **>(args));
> // If the execve() failed, we should exit. Follow Unix protocol and
> // return 127 if the executable was not found, and 126 otherwise.
> @@ -297,7 +295,7 @@ static bool Execute(void **Data, const P
> return true;
> }
>
> -static int Wait(void *&Data, const sys::Path &path, unsigned
> secondsToWait,
> +static int Wait(void *&Data, StringRef Program, unsigned secondsToWait,
> std::string *ErrMsg) {
> #ifdef HAVE_SYS_WAIT_H
> struct sigaction Act, Old;
> @@ -356,7 +354,7 @@ static int Wait(void *&Data, const sys::
> // itself apparently does not), check to see if the failure was due
> to some
> // reason other than the file not existing, and return 126 in this
> case.
> bool Exists;
> - if (result == 127 && !llvm::sys::fs::exists(path.str(), Exists) &&
> Exists)
> + if (result == 127 && !llvm::sys::fs::exists(Program, Exists) &&
> Exists)
> result = 126;
> #endif
> if (result == 127) {
>
> Modified: llvm/trunk/lib/Support/Windows/PathV2.inc
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/PathV2.inc?rev=183996&r1=183995&r2=183996&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Support/Windows/PathV2.inc (original)
> +++ llvm/trunk/lib/Support/Windows/PathV2.inc Fri Jun 14 14:38:45 2013
> @@ -362,6 +362,17 @@ error_code exists(const Twine &path, boo
> return error_code::success();
> }
>
> +bool can_execute(const Twine &Path) {
> + SmallString<128> PathStorage;
> + SmallVector<wchar_t, 128> PathUtf16;
> +
> + if (UTF8ToUTF16(Path.toStringRef(PathStorage), PathUtf16))
> + return false;
> +
> + DWORD Attr = ::GetFileAttributesW(PathUtf16.begin());
> + return Attr != INVALID_FILE_ATTRIBUTES;
> +}
> +
> bool equivalent(file_status A, file_status B) {
> assert(status_known(A) && status_known(B));
> return A.FileIndexHigh == B.FileIndexHigh &&
>
> Modified: llvm/trunk/lib/Support/Windows/Program.inc
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/Program.inc?rev=183996&r1=183995&r2=183996&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Support/Windows/Program.inc (original)
> +++ llvm/trunk/lib/Support/Windows/Program.inc Fri Jun 14 14:38:45 2013
> @@ -12,6 +12,7 @@
>
> //===----------------------------------------------------------------------===//
>
> #include "Windows.h"
> +#include "llvm/Support/FileSystem.h"
> #include <cstdio>
> #include <fcntl.h>
> #include <io.h>
> @@ -37,13 +38,11 @@ std::string sys::FindProgramByName(const
> // Check some degenerate cases
> if (progName.length() == 0) // no program
> return "";
> - Path temp;
> - if (!temp.set(progName)) // invalid name
> - return "";
> + std::string temp = progName;
> // Return paths with slashes verbatim.
> if (progName.find('\\') != std::string::npos ||
> progName.find('/') != std::string::npos)
> - return temp.str();
> + return temp;
>
> // At this point, the file name is valid and does not contain slashes.
> // Let Windows search for it.
> @@ -76,7 +75,7 @@ std::string sys::FindProgramByName(const
> }
> }
>
> -static HANDLE RedirectIO(const Path *path, int fd, std::string* ErrMsg) {
> +static HANDLE RedirectIO(const StringRef *path, int fd, std::string*
> ErrMsg) {
> HANDLE h;
> if (path == 0) {
> DuplicateHandle(GetCurrentProcess(), (HANDLE)_get_osfhandle(fd),
> @@ -85,19 +84,19 @@ static HANDLE RedirectIO(const Path *pat
> return h;
> }
>
> - const char *fname;
> - if (path->isEmpty())
> + std::string fname;
> + if (path->empty())
> fname = "NUL";
> else
> - fname = path->c_str();
> + fname = *path;
>
> SECURITY_ATTRIBUTES sa;
> sa.nLength = sizeof(sa);
> sa.lpSecurityDescriptor = 0;
> sa.bInheritHandle = TRUE;
>
> - h = CreateFile(fname, fd ? GENERIC_WRITE : GENERIC_READ,
> FILE_SHARE_READ,
> - &sa, fd == 0 ? OPEN_EXISTING : CREATE_ALWAYS,
> + h = CreateFile(fname.c_str(), fd ? GENERIC_WRITE : GENERIC_READ,
> + FILE_SHARE_READ, &sa, fd == 0 ? OPEN_EXISTING :
> CREATE_ALWAYS,
> FILE_ATTRIBUTE_NORMAL, NULL);
> if (h == INVALID_HANDLE_VALUE) {
> MakeErrMsg(ErrMsg, std::string(fname) + ": Can't open file for " +
> @@ -171,13 +170,13 @@ static unsigned int ArgLenWithQuotes(con
> }
>
> static bool Execute(void **Data,
> - const Path& path,
> + StringRef Program,
> const char** args,
> const char** envp,
> - const Path** redirects,
> + const StringRef** redirects,
> unsigned memoryLimit,
> std::string* ErrMsg) {
> - if (!path.canExecute()) {
> + if (!sys::fs::can_execute(Program)) {
> if (ErrMsg)
> *ErrMsg = "program not executable";
> return false;
> @@ -297,7 +296,8 @@ static bool Execute(void **Data,
>
> fflush(stdout);
> fflush(stderr);
> - BOOL rc = CreateProcess(path.c_str(), command, NULL, NULL, TRUE, 0,
> + std::string ProgramStr = Program;
> + BOOL rc = CreateProcess(ProgramStr.c_str(), command, NULL, NULL, TRUE,
> 0,
> envblock, NULL, &si, &pi);
> DWORD err = GetLastError();
>
> @@ -311,7 +311,7 @@ static bool Execute(void **Data,
> if (!rc) {
> SetLastError(err);
> MakeErrMsg(ErrMsg, std::string("Couldn't execute program '") +
> - path.str() + "'");
> + ProgramStr + "'");
> return false;
> }
> if (Data) {
> @@ -398,7 +398,7 @@ static int WaitAux(Win32ProcessInfo *wpi
> return 1;
> }
>
> -static int Wait(void *&Data, const Path &path, unsigned secondsToWait,
> +static int Wait(void *&Data, StringRef Program, unsigned secondsToWait,
> std::string *ErrMsg) {
> Win32ProcessInfo *wpi = reinterpret_cast<Win32ProcessInfo *>(Data);
> int Ret = WaitAux(wpi, secondsToWait, ErrMsg);
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130617/bcc870ea/attachment.html>
More information about the llvm-commits
mailing list