Program.cpp revision 288943
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" 16218885Sdim#include "llvm/Config/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 26261991Sdimstatic bool Execute(ProcessInfo &PI, StringRef Program, const char **args, 27261991Sdim const char **env, const StringRef **Redirects, 28261991Sdim unsigned memoryLimit, std::string *ErrMsg); 29261991Sdim 30261991Sdimint sys::ExecuteAndWait(StringRef Program, const char **args, const char **envp, 31261991Sdim const StringRef **redirects, unsigned secondsToWait, 32261991Sdim unsigned memoryLimit, std::string *ErrMsg, 33249423Sdim bool *ExecutionFailed) { 34261991Sdim ProcessInfo PI; 35261991Sdim if (Execute(PI, Program, args, envp, redirects, memoryLimit, ErrMsg)) { 36261991Sdim if (ExecutionFailed) 37261991Sdim *ExecutionFailed = false; 38276479Sdim ProcessInfo Result = Wait( 39276479Sdim PI, secondsToWait, /*WaitUntilTerminates=*/secondsToWait == 0, ErrMsg); 40261991Sdim return Result.ReturnCode; 41249423Sdim } 42261991Sdim 43261991Sdim if (ExecutionFailed) 44261991Sdim *ExecutionFailed = true; 45261991Sdim 46249423Sdim return -1; 47218885Sdim} 48218885Sdim 49261991SdimProcessInfo sys::ExecuteNoWait(StringRef Program, const char **args, 50261991Sdim const char **envp, const StringRef **redirects, 51261991Sdim unsigned memoryLimit, std::string *ErrMsg, 52261991Sdim bool *ExecutionFailed) { 53261991Sdim ProcessInfo PI; 54261991Sdim if (ExecutionFailed) 55261991Sdim *ExecutionFailed = false; 56261991Sdim if (!Execute(PI, Program, args, envp, redirects, memoryLimit, ErrMsg)) 57261991Sdim if (ExecutionFailed) 58261991Sdim *ExecutionFailed = true; 59261991Sdim 60261991Sdim return PI; 61218885Sdim} 62218885Sdim 63218885Sdim// Include the platform-specific parts of this class. 64218885Sdim#ifdef LLVM_ON_UNIX 65218885Sdim#include "Unix/Program.inc" 66218885Sdim#endif 67218885Sdim#ifdef LLVM_ON_WIN32 68218885Sdim#include "Windows/Program.inc" 69218885Sdim#endif 70