Program.cpp revision 341825
1218885Sdim//===-- Program.cpp - Implement OS Program Concept --------------*- C++ -*-===// 2218885Sdim// 3218885Sdim// The LLVM Compiler Infrastructure 4218885Sdim// 5218885Sdim// This file is distributed under the University of Illinois Open Source 6218885Sdim// License. See LICENSE.TXT for details. 7218885Sdim// 8218885Sdim//===----------------------------------------------------------------------===// 9218885Sdim// 10276479Sdim// This file implements the operating system Program concept. 11218885Sdim// 12218885Sdim//===----------------------------------------------------------------------===// 13218885Sdim 14218885Sdim#include "llvm/Support/Program.h" 15288943Sdim#include "llvm/ADT/StringRef.h" 16341825Sdim#include "llvm/Config/llvm-config.h" 17276479Sdim#include <system_error> 18218885Sdimusing namespace llvm; 19218885Sdimusing namespace sys; 20218885Sdim 21218885Sdim//===----------------------------------------------------------------------===// 22218885Sdim//=== WARNING: Implementation here must contain only TRULY operating system 23218885Sdim//=== independent code. 24218885Sdim//===----------------------------------------------------------------------===// 25218885Sdim 26341825Sdimstatic bool Execute(ProcessInfo &PI, StringRef Program, 27341825Sdim ArrayRef<StringRef> Args, Optional<ArrayRef<StringRef>> Env, 28341825Sdim ArrayRef<Optional<StringRef>> Redirects, 29327952Sdim unsigned MemoryLimit, std::string *ErrMsg); 30261991Sdim 31341825Sdimint sys::ExecuteAndWait(StringRef Program, ArrayRef<StringRef> Args, 32341825Sdim Optional<ArrayRef<StringRef>> Env, 33327952Sdim ArrayRef<Optional<StringRef>> Redirects, 34327952Sdim unsigned SecondsToWait, unsigned MemoryLimit, 35327952Sdim std::string *ErrMsg, bool *ExecutionFailed) { 36327952Sdim assert(Redirects.empty() || Redirects.size() == 3); 37261991Sdim ProcessInfo PI; 38341825Sdim if (Execute(PI, Program, Args, Env, Redirects, MemoryLimit, ErrMsg)) { 39261991Sdim if (ExecutionFailed) 40261991Sdim *ExecutionFailed = false; 41276479Sdim ProcessInfo Result = Wait( 42327952Sdim PI, SecondsToWait, /*WaitUntilTerminates=*/SecondsToWait == 0, ErrMsg); 43261991Sdim return Result.ReturnCode; 44249423Sdim } 45261991Sdim 46261991Sdim if (ExecutionFailed) 47261991Sdim *ExecutionFailed = true; 48261991Sdim 49249423Sdim return -1; 50218885Sdim} 51218885Sdim 52341825SdimProcessInfo sys::ExecuteNoWait(StringRef Program, ArrayRef<StringRef> Args, 53341825Sdim Optional<ArrayRef<StringRef>> Env, 54327952Sdim ArrayRef<Optional<StringRef>> Redirects, 55327952Sdim unsigned MemoryLimit, std::string *ErrMsg, 56261991Sdim bool *ExecutionFailed) { 57327952Sdim assert(Redirects.empty() || Redirects.size() == 3); 58261991Sdim ProcessInfo PI; 59261991Sdim if (ExecutionFailed) 60261991Sdim *ExecutionFailed = false; 61341825Sdim if (!Execute(PI, Program, Args, Env, Redirects, MemoryLimit, ErrMsg)) 62261991Sdim if (ExecutionFailed) 63261991Sdim *ExecutionFailed = true; 64261991Sdim 65261991Sdim return PI; 66218885Sdim} 67218885Sdim 68341825Sdimbool sys::commandLineFitsWithinSystemLimits(StringRef Program, 69341825Sdim ArrayRef<const char *> Args) { 70341825Sdim SmallVector<StringRef, 8> StringRefArgs; 71341825Sdim StringRefArgs.reserve(Args.size()); 72341825Sdim for (const char *A : Args) 73341825Sdim StringRefArgs.emplace_back(A); 74341825Sdim return commandLineFitsWithinSystemLimits(Program, StringRefArgs); 75341825Sdim} 76341825Sdim 77218885Sdim// Include the platform-specific parts of this class. 78218885Sdim#ifdef LLVM_ON_UNIX 79218885Sdim#include "Unix/Program.inc" 80218885Sdim#endif 81341825Sdim#ifdef _WIN32 82218885Sdim#include "Windows/Program.inc" 83218885Sdim#endif 84