blob: eb700e3a8591a7ce12b1bae8e5ac989f2c7ec04f [file] [log] [blame]
Reid Spencer76b83a12004-08-29 19:20:41 +00001//===-- Program.cpp - Implement OS Program Concept --------------*- C++ -*-===//
Misha Brukman10468d82005-04-21 22:55:34 +00002//
Reid Spencer76b83a12004-08-29 19:20:41 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Misha Brukman10468d82005-04-21 22:55:34 +00007//
Reid Spencer76b83a12004-08-29 19:20:41 +00008//===----------------------------------------------------------------------===//
9//
10// This header file implements the operating system Program concept.
11//
12//===----------------------------------------------------------------------===//
13
Michael J. Spencer447762d2010-11-29 18:16:10 +000014#include "llvm/Support/Program.h"
Reid Spencer51ea06a2004-12-27 06:16:25 +000015#include "llvm/Config/config.h"
Rafael Espindolaa6e9c3e2014-06-12 17:38:55 +000016#include <system_error>
Chris Lattnerd9e22a82010-04-18 03:33:55 +000017using namespace llvm;
Reid Spencer76b83a12004-08-29 19:20:41 +000018using namespace sys;
19
20//===----------------------------------------------------------------------===//
21//=== WARNING: Implementation here must contain only TRULY operating system
Misha Brukman10468d82005-04-21 22:55:34 +000022//=== independent code.
Reid Spencer76b83a12004-08-29 19:20:41 +000023//===----------------------------------------------------------------------===//
24
Tareq A. Sirajd88b9832013-10-01 14:28:18 +000025static bool Execute(ProcessInfo &PI, StringRef Program, const char **args,
Rafael Espindola7c1023a2013-06-13 20:25:38 +000026 const char **env, const StringRef **Redirects,
Rafael Espindolab0a5c962013-06-14 19:38:45 +000027 unsigned memoryLimit, std::string *ErrMsg);
Rafael Espindola6828fe42013-06-13 20:06:28 +000028
Rafael Espindola7c1023a2013-06-13 20:25:38 +000029int sys::ExecuteAndWait(StringRef Program, const char **args, const char **envp,
30 const StringRef **redirects, unsigned secondsToWait,
Rafael Espindolacb2eca02013-06-12 20:58:35 +000031 unsigned memoryLimit, std::string *ErrMsg,
Chad Rosier654190a2013-03-26 23:35:00 +000032 bool *ExecutionFailed) {
Tareq A. Sirajd88b9832013-10-01 14:28:18 +000033 ProcessInfo PI;
34 if (Execute(PI, Program, args, envp, redirects, memoryLimit, ErrMsg)) {
35 if (ExecutionFailed)
36 *ExecutionFailed = false;
Peter Collingbourneec1aaca2014-05-31 01:36:02 +000037 ProcessInfo Result = Wait(
38 PI, secondsToWait, /*WaitUntilTerminates=*/secondsToWait == 0, ErrMsg);
Tareq A. Sirajd88b9832013-10-01 14:28:18 +000039 return Result.ReturnCode;
Chad Rosier654190a2013-03-26 23:35:00 +000040 }
Tareq A. Sirajd88b9832013-10-01 14:28:18 +000041
42 if (ExecutionFailed)
43 *ExecutionFailed = true;
44
Chad Rosier654190a2013-03-26 23:35:00 +000045 return -1;
Mikhail Glushenkov36cb8322009-07-18 21:43:12 +000046}
47
Tareq A. Sirajd88b9832013-10-01 14:28:18 +000048ProcessInfo sys::ExecuteNoWait(StringRef Program, const char **args,
49 const char **envp, const StringRef **redirects,
50 unsigned memoryLimit, std::string *ErrMsg,
51 bool *ExecutionFailed) {
52 ProcessInfo PI;
53 if (ExecutionFailed)
54 *ExecutionFailed = false;
55 if (!Execute(PI, Program, args, envp, redirects, memoryLimit, ErrMsg))
56 if (ExecutionFailed)
57 *ExecutionFailed = true;
58
59 return PI;
Mikhail Glushenkov36cb8322009-07-18 21:43:12 +000060}
61
Reid Spencer76b83a12004-08-29 19:20:41 +000062// Include the platform-specific parts of this class.
Reid Spencer51ea06a2004-12-27 06:16:25 +000063#ifdef LLVM_ON_UNIX
Reid Spencerc892a0d2005-01-09 23:29:00 +000064#include "Unix/Program.inc"
Reid Spencer51ea06a2004-12-27 06:16:25 +000065#endif
66#ifdef LLVM_ON_WIN32
Michael J. Spencer447762d2010-11-29 18:16:10 +000067#include "Windows/Program.inc"
Reid Spencer51ea06a2004-12-27 06:16:25 +000068#endif