blob: 4212323bc0e1e1e28c0ecc1a9b9785fad4efaa1c [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//
Hans Wennborgcfe341f2014-06-20 01:36:00 +000010// This file implements the operating system Program concept.
Reid Spencer76b83a12004-08-29 19:20:41 +000011//
12//===----------------------------------------------------------------------===//
13
Michael J. Spencer447762d2010-11-29 18:16:10 +000014#include "llvm/Support/Program.h"
Benjamin Kramer16132e62015-03-23 18:07:13 +000015#include "llvm/ADT/StringRef.h"
Reid Spencer51ea06a2004-12-27 06:16:25 +000016#include "llvm/Config/config.h"
Rafael Espindolaa6e9c3e2014-06-12 17:38:55 +000017#include <system_error>
Chris Lattnerd9e22a82010-04-18 03:33:55 +000018using namespace llvm;
Reid Spencer76b83a12004-08-29 19:20:41 +000019using namespace sys;
20
21//===----------------------------------------------------------------------===//
22//=== WARNING: Implementation here must contain only TRULY operating system
Misha Brukman10468d82005-04-21 22:55:34 +000023//=== independent code.
Reid Spencer76b83a12004-08-29 19:20:41 +000024//===----------------------------------------------------------------------===//
25
Alexander Kornienko3ad84ee2017-09-06 16:28:33 +000026static bool Execute(ProcessInfo &PI, StringRef Program, const char **Args,
Alexander Kornienko208eecd2017-09-13 17:03:37 +000027 const char **Env, ArrayRef<Optional<StringRef>> Redirects,
Alexander Kornienko3ad84ee2017-09-06 16:28:33 +000028 unsigned MemoryLimit, std::string *ErrMsg);
Rafael Espindola6828fe42013-06-13 20:06:28 +000029
Alexander Kornienko3ad84ee2017-09-06 16:28:33 +000030int sys::ExecuteAndWait(StringRef Program, const char **Args, const char **Envp,
Alexander Kornienko208eecd2017-09-13 17:03:37 +000031 ArrayRef<Optional<StringRef>> Redirects,
32 unsigned SecondsToWait, unsigned MemoryLimit,
33 std::string *ErrMsg, bool *ExecutionFailed) {
34 assert(Redirects.empty() || Redirects.size() == 3);
Tareq A. Sirajd88b9832013-10-01 14:28:18 +000035 ProcessInfo PI;
Alexander Kornienko3ad84ee2017-09-06 16:28:33 +000036 if (Execute(PI, Program, Args, Envp, Redirects, MemoryLimit, ErrMsg)) {
Tareq A. Sirajd88b9832013-10-01 14:28:18 +000037 if (ExecutionFailed)
38 *ExecutionFailed = false;
Peter Collingbourneec1aaca2014-05-31 01:36:02 +000039 ProcessInfo Result = Wait(
Alexander Kornienko3ad84ee2017-09-06 16:28:33 +000040 PI, SecondsToWait, /*WaitUntilTerminates=*/SecondsToWait == 0, ErrMsg);
Tareq A. Sirajd88b9832013-10-01 14:28:18 +000041 return Result.ReturnCode;
Chad Rosier654190a2013-03-26 23:35:00 +000042 }
Tareq A. Sirajd88b9832013-10-01 14:28:18 +000043
44 if (ExecutionFailed)
45 *ExecutionFailed = true;
46
Chad Rosier654190a2013-03-26 23:35:00 +000047 return -1;
Mikhail Glushenkov36cb8322009-07-18 21:43:12 +000048}
49
Alexander Kornienko3ad84ee2017-09-06 16:28:33 +000050ProcessInfo sys::ExecuteNoWait(StringRef Program, const char **Args,
Alexander Kornienko208eecd2017-09-13 17:03:37 +000051 const char **Envp,
52 ArrayRef<Optional<StringRef>> Redirects,
Alexander Kornienko3ad84ee2017-09-06 16:28:33 +000053 unsigned MemoryLimit, std::string *ErrMsg,
Tareq A. Sirajd88b9832013-10-01 14:28:18 +000054 bool *ExecutionFailed) {
Alexander Kornienko208eecd2017-09-13 17:03:37 +000055 assert(Redirects.empty() || Redirects.size() == 3);
Tareq A. Sirajd88b9832013-10-01 14:28:18 +000056 ProcessInfo PI;
57 if (ExecutionFailed)
58 *ExecutionFailed = false;
Alexander Kornienko3ad84ee2017-09-06 16:28:33 +000059 if (!Execute(PI, Program, Args, Envp, Redirects, MemoryLimit, ErrMsg))
Tareq A. Sirajd88b9832013-10-01 14:28:18 +000060 if (ExecutionFailed)
61 *ExecutionFailed = true;
62
63 return PI;
Mikhail Glushenkov36cb8322009-07-18 21:43:12 +000064}
65
Reid Spencer76b83a12004-08-29 19:20:41 +000066// Include the platform-specific parts of this class.
Reid Spencer51ea06a2004-12-27 06:16:25 +000067#ifdef LLVM_ON_UNIX
Reid Spencerc892a0d2005-01-09 23:29:00 +000068#include "Unix/Program.inc"
Reid Spencer51ea06a2004-12-27 06:16:25 +000069#endif
70#ifdef LLVM_ON_WIN32
Michael J. Spencer447762d2010-11-29 18:16:10 +000071#include "Windows/Program.inc"
Reid Spencer51ea06a2004-12-27 06:16:25 +000072#endif