Process.cpp revision 360784
1112129Stjr//===-- Process.cpp - Implement OS Process Concept --------------*- C++ -*-===//
2112129Stjr//
3112129Stjr// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4112129Stjr// See https://llvm.org/LICENSE.txt for license information.
5112129Stjr// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6112129Stjr//
7112129Stjr//===----------------------------------------------------------------------===//
8112129Stjr//
9112129Stjr//  This file implements the operating system Process concept.
10112129Stjr//
11112129Stjr//===----------------------------------------------------------------------===//
12112129Stjr
13112129Stjr#include "llvm/Support/Process.h"
14112129Stjr#include "llvm/ADT/STLExtras.h"
15112129Stjr#include "llvm/ADT/StringExtras.h"
16112129Stjr#include "llvm/Config/config.h"
17112129Stjr#include "llvm/Config/llvm-config.h"
18112129Stjr#include "llvm/Support/CrashRecoveryContext.h"
19112129Stjr#include "llvm/Support/FileSystem.h"
20112129Stjr#include "llvm/Support/Path.h"
21112129Stjr#include "llvm/Support/Program.h"
22112129Stjr
23112129Stjrusing namespace llvm;
24112129Stjrusing namespace sys;
25112129Stjr
26112129Stjr//===----------------------------------------------------------------------===//
27112129Stjr//=== WARNING: Implementation here must contain only TRULY operating system
28112129Stjr//===          independent code.
29112129Stjr//===----------------------------------------------------------------------===//
30112129Stjr
31112129StjrOptional<std::string> Process::FindInEnvPath(StringRef EnvName,
32112129Stjr                                             StringRef FileName) {
33112129Stjr  return FindInEnvPath(EnvName, FileName, {});
34112129Stjr}
35112129Stjr
36112129StjrOptional<std::string> Process::FindInEnvPath(StringRef EnvName,
37112129Stjr                                             StringRef FileName,
38112129Stjr                                             ArrayRef<std::string> IgnoreList) {
39112129Stjr  assert(!path::is_absolute(FileName));
40112129Stjr  Optional<std::string> FoundPath;
41112129Stjr  Optional<std::string> OptPath = Process::GetEnv(EnvName);
42112129Stjr  if (!OptPath.hasValue())
43112129Stjr    return FoundPath;
44112129Stjr
45112129Stjr  const char EnvPathSeparatorStr[] = {EnvPathSeparator, '\0'};
46112129Stjr  SmallVector<StringRef, 8> Dirs;
47112129Stjr  SplitString(OptPath.getValue(), Dirs, EnvPathSeparatorStr);
48112129Stjr
49112129Stjr  for (StringRef Dir : Dirs) {
50112129Stjr    if (Dir.empty())
51112129Stjr      continue;
52112129Stjr
53112129Stjr    if (any_of(IgnoreList, [&](StringRef S) { return fs::equivalent(S, Dir); }))
54112129Stjr      continue;
55112129Stjr
56112129Stjr    SmallString<128> FilePath(Dir);
57112129Stjr    path::append(FilePath, FileName);
58112129Stjr    if (fs::exists(Twine(FilePath))) {
59112129Stjr      FoundPath = FilePath.str();
60112129Stjr      break;
61112129Stjr    }
62112129Stjr  }
63112129Stjr
64112129Stjr  return FoundPath;
65112129Stjr}
66112129Stjr
67112129Stjr
68112129Stjr#define COLOR(FGBG, CODE, BOLD) "\033[0;" BOLD FGBG CODE "m"
69112129Stjr
70112129Stjr#define ALLCOLORS(FGBG,BOLD) {\
71112129Stjr    COLOR(FGBG, "0", BOLD),\
72112129Stjr    COLOR(FGBG, "1", BOLD),\
73112129Stjr    COLOR(FGBG, "2", BOLD),\
74112129Stjr    COLOR(FGBG, "3", BOLD),\
75112129Stjr    COLOR(FGBG, "4", BOLD),\
76112129Stjr    COLOR(FGBG, "5", BOLD),\
77112129Stjr    COLOR(FGBG, "6", BOLD),\
78112129Stjr    COLOR(FGBG, "7", BOLD)\
79112129Stjr  }
80112129Stjr
81112129Stjrstatic const char colorcodes[2][2][8][10] = {
82112129Stjr { ALLCOLORS("3",""), ALLCOLORS("3","1;") },
83112129Stjr { ALLCOLORS("4",""), ALLCOLORS("4","1;") }
84112129Stjr};
85112129Stjr
86112129Stjr// A CMake option controls wheter we emit core dumps by default. An application
87112129Stjr// may disable core dumps by calling Process::PreventCoreFiles().
88112129Stjrstatic bool coreFilesPrevented = !LLVM_ENABLE_CRASH_DUMPS;
89112129Stjr
90112129Stjrbool Process::AreCoreFilesPrevented() { return coreFilesPrevented; }
91112129Stjr
92112129StjrLLVM_ATTRIBUTE_NORETURN
93112129Stjrvoid Process::Exit(int RetCode) {
94112129Stjr  if (CrashRecoveryContext *CRC = CrashRecoveryContext::GetCurrent())
95112129Stjr    CRC->HandleExit(RetCode);
96112132Stjr  ::exit(RetCode);
97112129Stjr}
98112129Stjr
99112129Stjr// Include the platform-specific parts of this class.
100112129Stjr#ifdef LLVM_ON_UNIX
101112129Stjr#include "Unix/Process.inc"
102112129Stjr#endif
103112129Stjr#ifdef _WIN32
104112129Stjr#include "Windows/Process.inc"
105112129Stjr#endif
106184548Speter