blob: 79f7e5fbb7e398534a094c94823854bf69a9db7b [file] [log] [blame]
Reid Spencer52a7efa2004-08-29 19:20:41 +00001//===-- Program.cpp - Implement OS Program Concept --------------*- C++ -*-===//
Misha Brukmanf976c852005-04-21 22:55:34 +00002//
Reid Spencer52a7efa2004-08-29 19:20:41 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-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 Brukmanf976c852005-04-21 22:55:34 +00007//
Reid Spencer52a7efa2004-08-29 19:20:41 +00008//===----------------------------------------------------------------------===//
9//
10// This header file implements the operating system Program concept.
11//
12//===----------------------------------------------------------------------===//
13
Michael J. Spencer1f6efa32010-11-29 18:16:10 +000014#include "llvm/Support/Program.h"
Reid Spencer424ac892004-12-27 06:16:25 +000015#include "llvm/Config/config.h"
Michael J. Spencerb92cb302011-12-13 23:16:49 +000016#include "llvm/Support/system_error.h"
Chris Lattnerb221ecb2010-04-18 03:33:55 +000017using namespace llvm;
Reid Spencer52a7efa2004-08-29 19:20:41 +000018using namespace sys;
19
20//===----------------------------------------------------------------------===//
21//=== WARNING: Implementation here must contain only TRULY operating system
Misha Brukmanf976c852005-04-21 22:55:34 +000022//=== independent code.
Reid Spencer52a7efa2004-08-29 19:20:41 +000023//===----------------------------------------------------------------------===//
24
Rafael Espindola675e0ac2013-06-13 20:25:38 +000025static bool Execute(void **Data, StringRef Program, const char **args,
26 const char **env, const StringRef **Redirects,
Rafael Espindolafcba9c52013-06-14 19:38:45 +000027 unsigned memoryLimit, std::string *ErrMsg);
Rafael Espindolaa29ece12013-06-13 20:06:28 +000028
Rafael Espindola675e0ac2013-06-13 20:25:38 +000029static int Wait(void *&Data, StringRef Program, unsigned secondsToWait,
Rafael Espindolafcba9c52013-06-14 19:38:45 +000030 std::string *ErrMsg);
Rafael Espindola675e0ac2013-06-13 20:25:38 +000031
32int sys::ExecuteAndWait(StringRef Program, const char **args, const char **envp,
33 const StringRef **redirects, unsigned secondsToWait,
Rafael Espindola9f1d9fd2013-06-12 20:58:35 +000034 unsigned memoryLimit, std::string *ErrMsg,
Chad Rosier847e36f2013-03-26 23:35:00 +000035 bool *ExecutionFailed) {
Aaron Ballman0db5f0f2013-06-13 14:39:07 +000036 void *Data = 0;
Rafael Espindola675e0ac2013-06-13 20:25:38 +000037 if (Execute(&Data, Program, args, envp, redirects, memoryLimit, ErrMsg)) {
Chad Rosier847e36f2013-03-26 23:35:00 +000038 if (ExecutionFailed) *ExecutionFailed = false;
Rafael Espindola675e0ac2013-06-13 20:25:38 +000039 return Wait(Data, Program, secondsToWait, ErrMsg);
Chad Rosier847e36f2013-03-26 23:35:00 +000040 }
41 if (ExecutionFailed) *ExecutionFailed = true;
42 return -1;
Mikhail Glushenkov31406192009-07-18 21:43:12 +000043}
44
Rafael Espindola675e0ac2013-06-13 20:25:38 +000045void sys::ExecuteNoWait(StringRef Program, const char **args, const char **envp,
46 const StringRef **redirects, unsigned memoryLimit,
Rafael Espindola9f1d9fd2013-06-12 20:58:35 +000047 std::string *ErrMsg) {
Rafael Espindola675e0ac2013-06-13 20:25:38 +000048 Execute(/*Data*/ 0, Program, args, envp, redirects, memoryLimit, ErrMsg);
Mikhail Glushenkov31406192009-07-18 21:43:12 +000049}
50
Reid Spencer52a7efa2004-08-29 19:20:41 +000051// Include the platform-specific parts of this class.
Reid Spencer424ac892004-12-27 06:16:25 +000052#ifdef LLVM_ON_UNIX
Reid Spencerbccc8ab2005-01-09 23:29:00 +000053#include "Unix/Program.inc"
Reid Spencer424ac892004-12-27 06:16:25 +000054#endif
55#ifdef LLVM_ON_WIN32
Michael J. Spencer1f6efa32010-11-29 18:16:10 +000056#include "Windows/Program.inc"
Reid Spencer424ac892004-12-27 06:16:25 +000057#endif