Program.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. //===-- Program.cpp - Implement OS Program Concept --------------*- C++ -*-===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // This file implements the operating system Program concept.
  11. //
  12. //===----------------------------------------------------------------------===//
  13. #include "llvm/Support/Program.h"
  14. #include "llvm/ADT/StringRef.h"
  15. #include "llvm/Config/llvm-config.h"
  16. #include <system_error>
  17. using namespace llvm;
  18. using namespace sys;
  19. //===----------------------------------------------------------------------===//
  20. //=== WARNING: Implementation here must contain only TRULY operating system
  21. //=== independent code.
  22. //===----------------------------------------------------------------------===//
  23. static bool Execute(ProcessInfo &PI, StringRef Program, const char **Args,
  24. const char **Env, ArrayRef<Optional<StringRef>> Redirects,
  25. unsigned MemoryLimit, std::string *ErrMsg);
  26. int sys::ExecuteAndWait(StringRef Program, const char **Args, const char **Envp,
  27. ArrayRef<Optional<StringRef>> Redirects,
  28. unsigned SecondsToWait, unsigned MemoryLimit,
  29. std::string *ErrMsg, bool *ExecutionFailed) {
  30. assert(Redirects.empty() || Redirects.size() == 3);
  31. ProcessInfo PI;
  32. if (Execute(PI, Program, Args, Envp, Redirects, MemoryLimit, ErrMsg)) {
  33. if (ExecutionFailed)
  34. *ExecutionFailed = false;
  35. ProcessInfo Result = Wait(
  36. PI, SecondsToWait, /*WaitUntilTerminates=*/SecondsToWait == 0, ErrMsg);
  37. return Result.ReturnCode;
  38. }
  39. if (ExecutionFailed)
  40. *ExecutionFailed = true;
  41. return -1;
  42. }
  43. ProcessInfo sys::ExecuteNoWait(StringRef Program, const char **Args,
  44. const char **Envp,
  45. ArrayRef<Optional<StringRef>> Redirects,
  46. unsigned MemoryLimit, std::string *ErrMsg,
  47. bool *ExecutionFailed) {
  48. assert(Redirects.empty() || Redirects.size() == 3);
  49. ProcessInfo PI;
  50. if (ExecutionFailed)
  51. *ExecutionFailed = false;
  52. if (!Execute(PI, Program, Args, Envp, Redirects, MemoryLimit, ErrMsg))
  53. if (ExecutionFailed)
  54. *ExecutionFailed = true;
  55. return PI;
  56. }
  57. bool sys::commandLineFitsWithinSystemLimits(StringRef Program,
  58. ArrayRef<const char *> Args) {
  59. SmallVector<StringRef, 8> StringRefArgs;
  60. StringRefArgs.reserve(Args.size());
  61. for (const char *A : Args)
  62. StringRefArgs.emplace_back(A);
  63. return commandLineFitsWithinSystemLimits(Program, StringRefArgs);
  64. }
  65. // Include the platform-specific parts of this class.
  66. #ifdef LLVM_ON_UNIX
  67. #include "Unix/Program.inc"
  68. #endif
  69. #ifdef _WIN32
  70. #include "Windows/Program.inc"
  71. #endif