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" 16234353Sdim#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 25263508Sdimstatic bool Execute(ProcessInfo &PI, StringRef Program, const char **args, 26263508Sdim const char **env, const StringRef **Redirects, 27263508Sdim unsigned memoryLimit, std::string *ErrMsg); 28263508Sdim 29263508Sdimint sys::ExecuteAndWait(StringRef Program, const char **args, const char **envp, 30263508Sdim const StringRef **redirects, unsigned secondsToWait, 31263508Sdim unsigned memoryLimit, std::string *ErrMsg, 32249423Sdim bool *ExecutionFailed) { 33263508Sdim ProcessInfo PI; 34263508Sdim if (Execute(PI, Program, args, envp, redirects, memoryLimit, ErrMsg)) { 35263508Sdim if (ExecutionFailed) 36263508Sdim *ExecutionFailed = false; 37263508Sdim ProcessInfo Result = Wait(PI, secondsToWait, true, ErrMsg); 38263508Sdim return Result.ReturnCode; 39249423Sdim } 40263508Sdim 41263508Sdim if (ExecutionFailed) 42263508Sdim *ExecutionFailed = true; 43263508Sdim 44249423Sdim return -1; 45218885Sdim} 46218885Sdim 47263508SdimProcessInfo sys::ExecuteNoWait(StringRef Program, const char **args, 48263508Sdim const char **envp, const StringRef **redirects, 49263508Sdim unsigned memoryLimit, std::string *ErrMsg, 50263508Sdim bool *ExecutionFailed) { 51263508Sdim ProcessInfo PI; 52263508Sdim if (ExecutionFailed) 53263508Sdim *ExecutionFailed = false; 54263508Sdim if (!Execute(PI, Program, args, envp, redirects, memoryLimit, ErrMsg)) 55263508Sdim if (ExecutionFailed) 56263508Sdim *ExecutionFailed = true; 57263508Sdim 58263508Sdim 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