1*9880d681SAndroid Build Coastguard Worker //===-- Program.cpp - Implement OS Program Concept --------------*- C++ -*-===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file implements the operating system Program concept.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Program.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/StringRef.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/Config/config.h"
17*9880d681SAndroid Build Coastguard Worker #include <system_error>
18*9880d681SAndroid Build Coastguard Worker using namespace llvm;
19*9880d681SAndroid Build Coastguard Worker using namespace sys;
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
22*9880d681SAndroid Build Coastguard Worker //=== WARNING: Implementation here must contain only TRULY operating system
23*9880d681SAndroid Build Coastguard Worker //=== independent code.
24*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker static bool Execute(ProcessInfo &PI, StringRef Program, const char **args,
27*9880d681SAndroid Build Coastguard Worker const char **env, const StringRef **Redirects,
28*9880d681SAndroid Build Coastguard Worker unsigned memoryLimit, std::string *ErrMsg);
29*9880d681SAndroid Build Coastguard Worker
ExecuteAndWait(StringRef Program,const char ** args,const char ** envp,const StringRef ** redirects,unsigned secondsToWait,unsigned memoryLimit,std::string * ErrMsg,bool * ExecutionFailed)30*9880d681SAndroid Build Coastguard Worker int sys::ExecuteAndWait(StringRef Program, const char **args, const char **envp,
31*9880d681SAndroid Build Coastguard Worker const StringRef **redirects, unsigned secondsToWait,
32*9880d681SAndroid Build Coastguard Worker unsigned memoryLimit, std::string *ErrMsg,
33*9880d681SAndroid Build Coastguard Worker bool *ExecutionFailed) {
34*9880d681SAndroid Build Coastguard Worker ProcessInfo PI;
35*9880d681SAndroid Build Coastguard Worker if (Execute(PI, Program, args, envp, redirects, memoryLimit, ErrMsg)) {
36*9880d681SAndroid Build Coastguard Worker if (ExecutionFailed)
37*9880d681SAndroid Build Coastguard Worker *ExecutionFailed = false;
38*9880d681SAndroid Build Coastguard Worker ProcessInfo Result = Wait(
39*9880d681SAndroid Build Coastguard Worker PI, secondsToWait, /*WaitUntilTerminates=*/secondsToWait == 0, ErrMsg);
40*9880d681SAndroid Build Coastguard Worker return Result.ReturnCode;
41*9880d681SAndroid Build Coastguard Worker }
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker if (ExecutionFailed)
44*9880d681SAndroid Build Coastguard Worker *ExecutionFailed = true;
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Worker return -1;
47*9880d681SAndroid Build Coastguard Worker }
48*9880d681SAndroid Build Coastguard Worker
ExecuteNoWait(StringRef Program,const char ** args,const char ** envp,const StringRef ** redirects,unsigned memoryLimit,std::string * ErrMsg,bool * ExecutionFailed)49*9880d681SAndroid Build Coastguard Worker ProcessInfo sys::ExecuteNoWait(StringRef Program, const char **args,
50*9880d681SAndroid Build Coastguard Worker const char **envp, const StringRef **redirects,
51*9880d681SAndroid Build Coastguard Worker unsigned memoryLimit, std::string *ErrMsg,
52*9880d681SAndroid Build Coastguard Worker bool *ExecutionFailed) {
53*9880d681SAndroid Build Coastguard Worker ProcessInfo PI;
54*9880d681SAndroid Build Coastguard Worker if (ExecutionFailed)
55*9880d681SAndroid Build Coastguard Worker *ExecutionFailed = false;
56*9880d681SAndroid Build Coastguard Worker if (!Execute(PI, Program, args, envp, redirects, memoryLimit, ErrMsg))
57*9880d681SAndroid Build Coastguard Worker if (ExecutionFailed)
58*9880d681SAndroid Build Coastguard Worker *ExecutionFailed = true;
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker return PI;
61*9880d681SAndroid Build Coastguard Worker }
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker // Include the platform-specific parts of this class.
64*9880d681SAndroid Build Coastguard Worker #ifdef LLVM_ON_UNIX
65*9880d681SAndroid Build Coastguard Worker #include "Unix/Program.inc"
66*9880d681SAndroid Build Coastguard Worker #endif
67*9880d681SAndroid Build Coastguard Worker #ifdef LLVM_ON_WIN32
68*9880d681SAndroid Build Coastguard Worker #include "Windows/Program.inc"
69*9880d681SAndroid Build Coastguard Worker #endif
70