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// 10218885Sdim// This header file implements the operating system Program concept. 11218885Sdim// 12218885Sdim//===----------------------------------------------------------------------===// 13218885Sdim 14218885Sdim#include "llvm/Support/Program.h" 15218885Sdim#include "llvm/Config/config.h" 16235633Sdim#include "llvm/Support/system_error.h" 17218885Sdimusing namespace llvm; 18218885Sdimusing namespace sys; 19218885Sdim 20218885Sdim//===----------------------------------------------------------------------===// 21218885Sdim//=== WARNING: Implementation here must contain only TRULY operating system 22218885Sdim//=== independent code. 23218885Sdim//===----------------------------------------------------------------------===// 24218885Sdim 25263509Sdimstatic bool Execute(ProcessInfo &PI, StringRef Program, const char **args, 26263509Sdim const char **env, const StringRef **Redirects, 27263509Sdim unsigned memoryLimit, std::string *ErrMsg); 28263509Sdim 29263509Sdimint sys::ExecuteAndWait(StringRef Program, const char **args, const char **envp, 30263509Sdim const StringRef **redirects, unsigned secondsToWait, 31263509Sdim unsigned memoryLimit, std::string *ErrMsg, 32252723Sdim bool *ExecutionFailed) { 33263509Sdim ProcessInfo PI; 34263509Sdim if (Execute(PI, Program, args, envp, redirects, memoryLimit, ErrMsg)) { 35263509Sdim if (ExecutionFailed) 36263509Sdim *ExecutionFailed = false; 37263509Sdim ProcessInfo Result = Wait(PI, secondsToWait, true, ErrMsg); 38263509Sdim return Result.ReturnCode; 39252723Sdim } 40263509Sdim 41263509Sdim if (ExecutionFailed) 42263509Sdim *ExecutionFailed = true; 43263509Sdim 44252723Sdim return -1; 45218885Sdim} 46218885Sdim 47263509SdimProcessInfo sys::ExecuteNoWait(StringRef Program, const char **args, 48263509Sdim const char **envp, const StringRef **redirects, 49263509Sdim unsigned memoryLimit, std::string *ErrMsg, 50263509Sdim bool *ExecutionFailed) { 51263509Sdim ProcessInfo PI; 52263509Sdim if (ExecutionFailed) 53263509Sdim *ExecutionFailed = false; 54263509Sdim if (!Execute(PI, Program, args, envp, redirects, memoryLimit, ErrMsg)) 55263509Sdim if (ExecutionFailed) 56263509Sdim *ExecutionFailed = true; 57263509Sdim 58263509Sdim return PI; 59218885Sdim} 60218885Sdim 61218885Sdim// Include the platform-specific parts of this class. 62218885Sdim#ifdef LLVM_ON_UNIX 63218885Sdim#include "Unix/Program.inc" 64218885Sdim#endif 65218885Sdim#ifdef LLVM_ON_WIN32 66218885Sdim#include "Windows/Program.inc" 67218885Sdim#endif 68