123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- //===-- 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
|