xref: /freebsd/contrib/llvm-project/llvm/lib/Support/Process.cpp (revision 56f3f2d2491e30f369f9461c3cb2a366bdffbe1d)
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.str());
63        break;
64      }
65    }
66  
67    return FoundPath;
68  }
69  
70  
71  #define COLOR(FGBG, CODE, BOLD) "\033[0;" BOLD FGBG CODE "m"
72  
73  #define ALLCOLORS(FGBG,BOLD) {\
74      COLOR(FGBG, "0", BOLD),\
75      COLOR(FGBG, "1", BOLD),\
76      COLOR(FGBG, "2", BOLD),\
77      COLOR(FGBG, "3", BOLD),\
78      COLOR(FGBG, "4", BOLD),\
79      COLOR(FGBG, "5", BOLD),\
80      COLOR(FGBG, "6", BOLD),\
81      COLOR(FGBG, "7", BOLD)\
82    }
83  
84  static const char colorcodes[2][2][8][10] = {
85   { ALLCOLORS("3",""), ALLCOLORS("3","1;") },
86   { ALLCOLORS("4",""), ALLCOLORS("4","1;") }
87  };
88  
89  // A CMake option controls wheter we emit core dumps by default. An application
90  // may disable core dumps by calling Process::PreventCoreFiles().
91  static bool coreFilesPrevented = !LLVM_ENABLE_CRASH_DUMPS;
92  
93  bool Process::AreCoreFilesPrevented() { return coreFilesPrevented; }
94  
95  [[noreturn]] void Process::Exit(int RetCode, bool NoCleanup) {
96    if (CrashRecoveryContext *CRC = CrashRecoveryContext::GetCurrent())
97      CRC->HandleExit(RetCode);
98  
99    if (NoCleanup)
100      ExitNoCleanup(RetCode);
101    else
102      ::exit(RetCode);
103  }
104  
105  // Include the platform-specific parts of this class.
106  #ifdef LLVM_ON_UNIX
107  #include "Unix/Process.inc"
108  #endif
109  #ifdef _WIN32
110  #include "Windows/Process.inc"
111  #endif
112