xref: /freebsd/contrib/llvm-project/llvm/lib/Support/Process.cpp (revision caaeab697bf98bf96e2fa8cb4a1e22240511fbcc)
1  //===-- Process.cpp - Implement OS Process Concept --------------*- C++ -*-===//
2  //
3  // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4  // See https://llvm.org/LICENSE.txt for license information.
5  // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6  //
7  //===----------------------------------------------------------------------===//
8  //
9  //  This file implements the operating system Process concept.
10  //
11  //===----------------------------------------------------------------------===//
12  
13  #include "llvm/Support/Process.h"
14  #include "llvm/ADT/STLExtras.h"
15  #include "llvm/ADT/StringExtras.h"
16  #include "llvm/Config/config.h"
17  #include "llvm/Config/llvm-config.h"
18  #include "llvm/Support/CrashRecoveryContext.h"
19  #include "llvm/Support/FileSystem.h"
20  #include "llvm/Support/Path.h"
21  #include "llvm/Support/Program.h"
22  
23  #include <optional>
24  #include <stdlib.h> // for _Exit
25  
26  using namespace llvm;
27  using namespace sys;
28  
29  //===----------------------------------------------------------------------===//
30  //=== WARNING: Implementation here must contain only TRULY operating system
31  //===          independent code.
32  //===----------------------------------------------------------------------===//
33  
34  std::optional<std::string>
35  Process::FindInEnvPath(StringRef EnvName, StringRef FileName, char Separator) {
36    return FindInEnvPath(EnvName, FileName, {}, Separator);
37  }
38  
39  std::optional<std::string>
40  Process::FindInEnvPath(StringRef EnvName, StringRef FileName,
41                         ArrayRef<std::string> IgnoreList, char Separator) {
42    assert(!path::is_absolute(FileName));
43    std::optional<std::string> FoundPath;
44    std::optional<std::string> OptPath = Process::GetEnv(EnvName);
45    if (!OptPath)
46      return FoundPath;
47  
48    const char EnvPathSeparatorStr[] = {Separator, '\0'};
49    SmallVector<StringRef, 8> Dirs;
50    SplitString(*OptPath, Dirs, EnvPathSeparatorStr);
51  
52    for (StringRef Dir : Dirs) {
53      if (Dir.empty())
54        continue;
55  
56      if (any_of(IgnoreList, [&](StringRef S) { return fs::equivalent(S, Dir); }))
57        continue;
58  
59      SmallString<128> FilePath(Dir);
60      path::append(FilePath, FileName);
61      if (fs::exists(Twine(FilePath))) {
62        FoundPath = std::string(FilePath);
63        break;
64      }
65    }
66  
67    return FoundPath;
68  }
69  
70  // clang-format off
71  #define COLOR(FGBG, CODE, BOLD) "\033[0;" BOLD FGBG CODE "m"
72  
73  #define ALLCOLORS(FGBG, BRIGHT, BOLD) \
74    {                           \
75      COLOR(FGBG, "0", BOLD),   \
76      COLOR(FGBG, "1", BOLD),   \
77      COLOR(FGBG, "2", BOLD),   \
78      COLOR(FGBG, "3", BOLD),   \
79      COLOR(FGBG, "4", BOLD),   \
80      COLOR(FGBG, "5", BOLD),   \
81      COLOR(FGBG, "6", BOLD),   \
82      COLOR(FGBG, "7", BOLD),   \
83      COLOR(BRIGHT, "0", BOLD), \
84      COLOR(BRIGHT, "1", BOLD), \
85      COLOR(BRIGHT, "2", BOLD), \
86      COLOR(BRIGHT, "3", BOLD), \
87      COLOR(BRIGHT, "4", BOLD), \
88      COLOR(BRIGHT, "5", BOLD), \
89      COLOR(BRIGHT, "6", BOLD), \
90      COLOR(BRIGHT, "7", BOLD), \
91    }
92  
93  //                           bg
94  //                           |  bold
95  //                           |  |
96  //                           |  |   codes
97  //                           |  |   |
98  //                           |  |   |
99  static const char colorcodes[2][2][16][11] = {
100      { ALLCOLORS("3", "9", ""), ALLCOLORS("3", "9", "1;"),},
101      { ALLCOLORS("4", "10", ""), ALLCOLORS("4", "10", "1;")}
102  };
103  // clang-format on
104  
105  // A CMake option controls wheter we emit core dumps by default. An application
106  // may disable core dumps by calling Process::PreventCoreFiles().
107  static bool coreFilesPrevented = !LLVM_ENABLE_CRASH_DUMPS;
108  
109  bool Process::AreCoreFilesPrevented() { return coreFilesPrevented; }
110  
111  [[noreturn]] void Process::Exit(int RetCode, bool NoCleanup) {
112    if (CrashRecoveryContext *CRC = CrashRecoveryContext::GetCurrent())
113      CRC->HandleExit(RetCode);
114  
115    if (NoCleanup)
116      ExitNoCleanup(RetCode);
117    else
118      ::exit(RetCode);
119  }
120  
121  // Include the platform-specific parts of this class.
122  #ifdef LLVM_ON_UNIX
123  #include "Unix/Process.inc"
124  #endif
125  #ifdef _WIN32
126  #include "Windows/Process.inc"
127  #endif
128