1 //===-- Program.cpp - Implement OS Program Concept --------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the operating system Program concept.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/Support/Program.h"
15 #include "llvm/ADT/StringRef.h"
16 #include "llvm/Config/llvm-config.h"
17 #include <system_error>
21 //===----------------------------------------------------------------------===//
22 //=== WARNING: Implementation here must contain only TRULY operating system
23 //=== independent code.
24 //===----------------------------------------------------------------------===//
26 static bool Execute(ProcessInfo
&PI
, StringRef Program
,
27 ArrayRef
<StringRef
> Args
, Optional
<ArrayRef
<StringRef
>> Env
,
28 ArrayRef
<Optional
<StringRef
>> Redirects
,
29 unsigned MemoryLimit
, std::string
*ErrMsg
);
31 int sys::ExecuteAndWait(StringRef Program
, ArrayRef
<StringRef
> Args
,
32 Optional
<ArrayRef
<StringRef
>> Env
,
33 ArrayRef
<Optional
<StringRef
>> Redirects
,
34 unsigned SecondsToWait
, unsigned MemoryLimit
,
35 std::string
*ErrMsg
, bool *ExecutionFailed
) {
36 assert(Redirects
.empty() || Redirects
.size() == 3);
38 if (Execute(PI
, Program
, Args
, Env
, Redirects
, MemoryLimit
, ErrMsg
)) {
40 *ExecutionFailed
= false;
41 ProcessInfo Result
= Wait(
42 PI
, SecondsToWait
, /*WaitUntilTerminates=*/SecondsToWait
== 0, ErrMsg
);
43 return Result
.ReturnCode
;
47 *ExecutionFailed
= true;
52 ProcessInfo
sys::ExecuteNoWait(StringRef Program
, ArrayRef
<StringRef
> Args
,
53 Optional
<ArrayRef
<StringRef
>> Env
,
54 ArrayRef
<Optional
<StringRef
>> Redirects
,
55 unsigned MemoryLimit
, std::string
*ErrMsg
,
56 bool *ExecutionFailed
) {
57 assert(Redirects
.empty() || Redirects
.size() == 3);
60 *ExecutionFailed
= false;
61 if (!Execute(PI
, Program
, Args
, Env
, Redirects
, MemoryLimit
, ErrMsg
))
63 *ExecutionFailed
= true;
68 bool sys::commandLineFitsWithinSystemLimits(StringRef Program
,
69 ArrayRef
<const char *> Args
) {
70 SmallVector
<StringRef
, 8> StringRefArgs
;
71 StringRefArgs
.reserve(Args
.size());
72 for (const char *A
: Args
)
73 StringRefArgs
.emplace_back(A
);
74 return commandLineFitsWithinSystemLimits(Program
, StringRefArgs
);
77 // Include the platform-specific parts of this class.
79 #include "Unix/Program.inc"
82 #include "Windows/Program.inc"