mirror of
https://github.com/RPCS3/llvm.git
synced 2025-04-14 12:01:21 +00:00

I took some liberties and quoted fewer characters than before, based on an article from MSDN which says that only certain characters cause an arg to require quoting. This seems to be incorrect, though, and worse it seems to be a difference in Windows version. The bot that fails is Windows 7, and I can't reproduce the failure on Win 10. But it's definitely related to quoting and special characters, because both tests that fail have a * in the argument, which is one of the special characters that would cause an argument to be quoted before but not any longer after the new patch. Since I don't have Win 7, all I can do is just guess that I need to restore the old quoting rules. So this patch does that in hopes that it fixes the problem on Windows 7. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334375 91177308-0d34-0410-b5e6-96231b3b80d8
82 lines
2.9 KiB
C++
82 lines
2.9 KiB
C++
//===-- Program.cpp - Implement OS Program Concept --------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements the operating system Program concept.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Support/Program.h"
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/Config/llvm-config.h"
|
|
#include <system_error>
|
|
using namespace llvm;
|
|
using namespace sys;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
//=== WARNING: Implementation here must contain only TRULY operating system
|
|
//=== independent code.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
static bool Execute(ProcessInfo &PI, StringRef Program, const char **Args,
|
|
const char **Env, ArrayRef<Optional<StringRef>> Redirects,
|
|
unsigned MemoryLimit, std::string *ErrMsg);
|
|
|
|
int sys::ExecuteAndWait(StringRef Program, const char **Args, const char **Envp,
|
|
ArrayRef<Optional<StringRef>> Redirects,
|
|
unsigned SecondsToWait, unsigned MemoryLimit,
|
|
std::string *ErrMsg, bool *ExecutionFailed) {
|
|
assert(Redirects.empty() || Redirects.size() == 3);
|
|
ProcessInfo PI;
|
|
if (Execute(PI, Program, Args, Envp, Redirects, MemoryLimit, ErrMsg)) {
|
|
if (ExecutionFailed)
|
|
*ExecutionFailed = false;
|
|
ProcessInfo Result = Wait(
|
|
PI, SecondsToWait, /*WaitUntilTerminates=*/SecondsToWait == 0, ErrMsg);
|
|
return Result.ReturnCode;
|
|
}
|
|
|
|
if (ExecutionFailed)
|
|
*ExecutionFailed = true;
|
|
|
|
return -1;
|
|
}
|
|
|
|
ProcessInfo sys::ExecuteNoWait(StringRef Program, const char **Args,
|
|
const char **Envp,
|
|
ArrayRef<Optional<StringRef>> Redirects,
|
|
unsigned MemoryLimit, std::string *ErrMsg,
|
|
bool *ExecutionFailed) {
|
|
assert(Redirects.empty() || Redirects.size() == 3);
|
|
ProcessInfo PI;
|
|
if (ExecutionFailed)
|
|
*ExecutionFailed = false;
|
|
if (!Execute(PI, Program, Args, Envp, Redirects, MemoryLimit, ErrMsg))
|
|
if (ExecutionFailed)
|
|
*ExecutionFailed = true;
|
|
|
|
return PI;
|
|
}
|
|
|
|
bool sys::commandLineFitsWithinSystemLimits(StringRef Program,
|
|
ArrayRef<const char *> Args) {
|
|
SmallVector<StringRef, 8> StringRefArgs;
|
|
StringRefArgs.reserve(Args.size());
|
|
for (const char *A : Args)
|
|
StringRefArgs.emplace_back(A);
|
|
return commandLineFitsWithinSystemLimits(Program, StringRefArgs);
|
|
}
|
|
|
|
// Include the platform-specific parts of this class.
|
|
#ifdef LLVM_ON_UNIX
|
|
#include "Unix/Program.inc"
|
|
#endif
|
|
#ifdef _WIN32
|
|
#include "Windows/Program.inc"
|
|
#endif
|