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