1 //===-- Process.cpp - Implement OS Process Concept --------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // This file implements the operating system Process concept.
11 //===----------------------------------------------------------------------===//
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"
23 #include <stdlib.h> // for _Exit
28 //===----------------------------------------------------------------------===//
29 //=== WARNING: Implementation here must contain only TRULY operating system
30 //=== independent code.
31 //===----------------------------------------------------------------------===//
33 std::optional
<std::string
>
34 Process::FindInEnvPath(StringRef EnvName
, StringRef FileName
, char Separator
) {
35 return FindInEnvPath(EnvName
, FileName
, {}, Separator
);
38 std::optional
<std::string
>
39 Process::FindInEnvPath(StringRef EnvName
, StringRef FileName
,
40 ArrayRef
<std::string
> IgnoreList
, char Separator
) {
41 assert(!path::is_absolute(FileName
));
42 std::optional
<std::string
> FoundPath
;
43 std::optional
<std::string
> OptPath
= Process::GetEnv(EnvName
);
47 const char EnvPathSeparatorStr
[] = {Separator
, '\0'};
48 SmallVector
<StringRef
, 8> Dirs
;
49 SplitString(*OptPath
, Dirs
, EnvPathSeparatorStr
);
51 for (StringRef Dir
: Dirs
) {
55 if (any_of(IgnoreList
, [&](StringRef S
) { return fs::equivalent(S
, Dir
); }))
58 SmallString
<128> FilePath(Dir
);
59 path::append(FilePath
, FileName
);
60 if (fs::exists(Twine(FilePath
))) {
61 FoundPath
= std::string(FilePath
);
70 #define COLOR(FGBG, CODE, BOLD) "\033[0;" BOLD FGBG CODE "m"
72 #define ALLCOLORS(FGBG, BRIGHT, 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 COLOR(BRIGHT, "0", BOLD), \
83 COLOR(BRIGHT, "1", BOLD), \
84 COLOR(BRIGHT, "2", BOLD), \
85 COLOR(BRIGHT, "3", BOLD), \
86 COLOR(BRIGHT, "4", BOLD), \
87 COLOR(BRIGHT, "5", BOLD), \
88 COLOR(BRIGHT, "6", BOLD), \
89 COLOR(BRIGHT, "7", BOLD), \
98 static const char colorcodes
[2][2][16][11] = {
99 { ALLCOLORS("3", "9", ""), ALLCOLORS("3", "9", "1;"),},
100 { ALLCOLORS("4", "10", ""), ALLCOLORS("4", "10", "1;")}
104 // A CMake option controls wheter we emit core dumps by default. An application
105 // may disable core dumps by calling Process::PreventCoreFiles().
106 static bool coreFilesPrevented
= !LLVM_ENABLE_CRASH_DUMPS
;
108 bool Process::AreCoreFilesPrevented() { return coreFilesPrevented
; }
110 [[noreturn
]] void Process::Exit(int RetCode
, bool NoCleanup
) {
111 if (CrashRecoveryContext
*CRC
= CrashRecoveryContext::GetCurrent())
112 CRC
->HandleExit(RetCode
);
115 ExitNoCleanup(RetCode
);
120 // Include the platform-specific parts of this class.
122 #include "Unix/Process.inc"
125 #include "Windows/Process.inc"