LLVM 22.0.0git
Process.cpp
Go to the documentation of this file.
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
14#include "llvm/ADT/STLExtras.h"
16#include "llvm/Config/config.h"
17#include "llvm/Config/llvm-config.h"
20#include "llvm/Support/Path.h"
21
22#include <optional>
23#include <stdlib.h> // for _Exit
24
25using namespace llvm;
26using namespace sys;
27
28//===----------------------------------------------------------------------===//
29//=== WARNING: Implementation here must contain only TRULY operating system
30//=== independent code.
31//===----------------------------------------------------------------------===//
32
33std::optional<std::string>
34Process::FindInEnvPath(StringRef EnvName, StringRef FileName, char Separator) {
35 return FindInEnvPath(EnvName, FileName, {}, Separator);
36}
37
38std::optional<std::string>
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);
44 if (!OptPath)
45 return FoundPath;
46
47 const char EnvPathSeparatorStr[] = {Separator, '\0'};
49 SplitString(*OptPath, Dirs, EnvPathSeparatorStr);
50
51 for (StringRef Dir : Dirs) {
52 if (Dir.empty())
53 continue;
54
55 if (any_of(IgnoreList, [&](StringRef S) { return fs::equivalent(S, Dir); }))
56 continue;
57
58 SmallString<128> FilePath(Dir);
59 path::append(FilePath, FileName);
60 if (fs::exists(Twine(FilePath))) {
61 FoundPath = std::string(FilePath);
62 break;
63 }
64 }
65
66 return FoundPath;
67}
68
69// clang-format off
70#define COLOR(FGBG, CODE, BOLD) "\033[0;" BOLD FGBG CODE "m"
71
72#define ALLCOLORS(FGBG, BRIGHT, BOLD) \
73 { \
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), \
90 }
91
92// bg
93// | bold
94// | |
95// | | codes
96// | | |
97// | | |
98static const char colorcodes[2][2][16][11] = {
99 { ALLCOLORS("3", "9", ""), ALLCOLORS("3", "9", "1;"),},
100 { ALLCOLORS("4", "10", ""), ALLCOLORS("4", "10", "1;")}
101};
102// clang-format on
103
104// A CMake option controls wheter we emit core dumps by default. An application
105// may disable core dumps by calling Process::PreventCoreFiles().
106static bool coreFilesPrevented = !LLVM_ENABLE_CRASH_DUMPS;
107
109
110[[noreturn]] void Process::Exit(int RetCode, bool NoCleanup) {
112 CRC->HandleExit(RetCode);
113
114 if (NoCleanup)
115 ExitNoCleanup(RetCode);
116 else
117 ::exit(RetCode);
118}
119
120// Include the platform-specific parts of this class.
121#ifdef LLVM_ON_UNIX
122#include "Unix/Process.inc"
123#endif
124#ifdef _WIN32
125#include "Windows/Process.inc"
126#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool coreFilesPrevented
Definition: Process.cpp:106
#define ALLCOLORS(FGBG, BRIGHT, BOLD)
Definition: Process.cpp:72
static const char colorcodes[2][2][16][11]
Definition: Process.cpp:98
Provides a library for accessing information about this process and other processes on the operating ...
This file contains some templates that are useful if you are working with the STL at all.
This file contains some functions that are useful when dealing with strings.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
Crash recovery helper object.
static LLVM_ABI CrashRecoveryContext * GetCurrent()
Return the active context, if the code is currently executing in a thread which is in a protected con...
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition: SmallString.h:26
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1197
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:55
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:82
static LLVM_ABI std::optional< std::string > FindInEnvPath(StringRef EnvName, StringRef FileName, ArrayRef< std::string > IgnoreList, char Separator=EnvPathSeparator)
This function searches for an existing file in the list of directories in a PATH like environment var...
Definition: Process.cpp:39
static LLVM_ABI void Exit(int RetCode, bool NoCleanup=false)
Equivalent to ::exit(), except when running inside a CrashRecoveryContext.
Definition: Process.cpp:110
static LLVM_ABI bool AreCoreFilesPrevented()
true if PreventCoreFiles has been called, false otherwise.
Definition: Process.cpp:108
static LLVM_ABI std::optional< std::string > GetEnv(StringRef name)
LLVM_ABI bool exists(const basic_file_status &status)
Does file exist?
Definition: Path.cpp:1077
LLVM_ABI bool equivalent(file_status A, file_status B)
Do file_status's represent the same thing?
LLVM_ABI bool is_absolute(const Twine &path, Style style=Style::native)
Is path absolute?
Definition: Path.cpp:671
LLVM_ABI void append(SmallVectorImpl< char > &path, const Twine &a, const Twine &b="", const Twine &c="", const Twine &d="")
Append to path.
Definition: Path.cpp:456
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1751