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