brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.9 KiB · 57bcc2d Raw
127 lines · cpp
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-exception6//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 22#include <optional>23#include <stdlib.h> // for _Exit24 25using namespace llvm;26using namespace sys;27 28//===----------------------------------------------------------------------===//29//=== WARNING: Implementation here must contain only TRULY operating system30//===          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>39Process::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);44  if (!OptPath)45    return FoundPath;46 47  const char EnvPathSeparatorStr[] = {Separator, '\0'};48  SmallVector<StringRef, 8> Dirs;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 off70#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//                           bg93//                           |  bold94//                           |  |95//                           |  |   codes96//                           |  |   |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 on103 104// A CMake option controls wheter we emit core dumps by default. An application105// may disable core dumps by calling Process::PreventCoreFiles().106static bool coreFilesPrevented = !LLVM_ENABLE_CRASH_DUMPS;107 108bool Process::AreCoreFilesPrevented() { return coreFilesPrevented; }109 110[[noreturn]] void Process::Exit(int RetCode, bool NoCleanup) {111  if (CrashRecoveryContext *CRC = CrashRecoveryContext::GetCurrent())112    CRC->HandleExit(RetCode);113 114  if (NoCleanup)115    ExitNoCleanup(RetCode);116  else117    ::exit(RetCode);118}119 120// Include the platform-specific parts of this class.121#ifdef LLVM_ON_UNIX122#include "Unix/Process.inc"123#endif124#ifdef _WIN32125#include "Windows/Process.inc"126#endif127