blob: 6e04a1cd536ddaedc272b6e9e9e8b5feb1e3876d [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"
Michael J. Spencera2755f82011-12-13 23:16:49 +000016#include "llvm/Support/system_error.h"
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
Rafael Espindolacb2eca02013-06-12 20:58:35 +000025static bool Execute(void *&Data, const Path &path, const char **args,
26 const char **env, const sys::Path **redirects,
27 unsigned memoryLimit, std::string *ErrMsg);
28
29static int Wait(void *&Data, const Path &path, unsigned secondsToWait,
30 std::string *ErrMsg);
31
32int sys::ExecuteAndWait(const Path &path, const char **args, const char **envp,
33 const Path **redirects, unsigned secondsToWait,
34 unsigned memoryLimit, std::string *ErrMsg,
Chad Rosier654190a2013-03-26 23:35:00 +000035 bool *ExecutionFailed) {
Aaron Ballman54e9bd22013-06-13 14:39:07 +000036 void *Data = 0;
Rafael Espindolacb2eca02013-06-12 20:58:35 +000037 if (Execute(Data, path, args, envp, redirects, memoryLimit, ErrMsg)) {
Chad Rosier654190a2013-03-26 23:35:00 +000038 if (ExecutionFailed) *ExecutionFailed = false;
Rafael Espindolacb2eca02013-06-12 20:58:35 +000039 return Wait(Data, path, secondsToWait, ErrMsg);
Chad Rosier654190a2013-03-26 23:35:00 +000040 }
41 if (ExecutionFailed) *ExecutionFailed = true;
42 return -1;
Mikhail Glushenkov36cb8322009-07-18 21:43:12 +000043}
44
Rafael Espindolacb2eca02013-06-12 20:58:35 +000045void sys::ExecuteNoWait(const Path &path, const char **args, const char **envp,
46 const Path **redirects, unsigned memoryLimit,
47 std::string *ErrMsg) {
Aaron Ballman54e9bd22013-06-13 14:39:07 +000048 void *Data = 0;
Rafael Espindolacb2eca02013-06-12 20:58:35 +000049 Execute(Data, path, args, envp, redirects, memoryLimit, ErrMsg);
Mikhail Glushenkov36cb8322009-07-18 21:43:12 +000050}
51
Reid Spencer76b83a12004-08-29 19:20:41 +000052// Include the platform-specific parts of this class.
Reid Spencer51ea06a2004-12-27 06:16:25 +000053#ifdef LLVM_ON_UNIX
Reid Spencerc892a0d2005-01-09 23:29:00 +000054#include "Unix/Program.inc"
Reid Spencer51ea06a2004-12-27 06:16:25 +000055#endif
56#ifdef LLVM_ON_WIN32
Michael J. Spencer447762d2010-11-29 18:16:10 +000057#include "Windows/Program.inc"
Reid Spencer51ea06a2004-12-27 06:16:25 +000058#endif