• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  //===-- Process.cpp - Implement OS Process Concept --------------*- C++ -*-===//
2  //
3  //                     The LLVM Compiler Infrastructure
4  //
5  // This file is distributed under the University of Illinois Open Source
6  // License. See LICENSE.TXT for details.
7  //
8  //===----------------------------------------------------------------------===//
9  //
10  //  This file implements the operating system Process concept.
11  //
12  //===----------------------------------------------------------------------===//
13  
14  #include "llvm/ADT/StringExtras.h"
15  #include "llvm/Config/config.h"
16  #include "llvm/Support/FileSystem.h"
17  #include "llvm/Support/Path.h"
18  #include "llvm/Support/Process.h"
19  #include "llvm/Support/Program.h"
20  
21  using namespace llvm;
22  using namespace sys;
23  
24  //===----------------------------------------------------------------------===//
25  //=== WARNING: Implementation here must contain only TRULY operating system
26  //===          independent code.
27  //===----------------------------------------------------------------------===//
28  
FindInEnvPath(const std::string & EnvName,const std::string & FileName)29  Optional<std::string> Process::FindInEnvPath(const std::string& EnvName,
30                                               const std::string& FileName)
31  {
32    assert(!path::is_absolute(FileName));
33    Optional<std::string> FoundPath;
34    Optional<std::string> OptPath = Process::GetEnv(EnvName);
35    if (!OptPath.hasValue())
36      return FoundPath;
37  
38    const char EnvPathSeparatorStr[] = {EnvPathSeparator, '\0'};
39    SmallVector<StringRef, 8> Dirs;
40    SplitString(OptPath.getValue(), Dirs, EnvPathSeparatorStr);
41  
42    for (const auto &Dir : Dirs) {
43      if (Dir.empty())
44        continue;
45  
46      SmallString<128> FilePath(Dir);
47      path::append(FilePath, FileName);
48      if (fs::exists(Twine(FilePath))) {
49        FoundPath = FilePath.str();
50        break;
51      }
52    }
53  
54    return FoundPath;
55  }
56  
57  
58  #define COLOR(FGBG, CODE, BOLD) "\033[0;" BOLD FGBG CODE "m"
59  
60  #define ALLCOLORS(FGBG,BOLD) {\
61      COLOR(FGBG, "0", BOLD),\
62      COLOR(FGBG, "1", BOLD),\
63      COLOR(FGBG, "2", BOLD),\
64      COLOR(FGBG, "3", BOLD),\
65      COLOR(FGBG, "4", BOLD),\
66      COLOR(FGBG, "5", BOLD),\
67      COLOR(FGBG, "6", BOLD),\
68      COLOR(FGBG, "7", BOLD)\
69    }
70  
71  static const char colorcodes[2][2][8][10] = {
72   { ALLCOLORS("3",""), ALLCOLORS("3","1;") },
73   { ALLCOLORS("4",""), ALLCOLORS("4","1;") }
74  };
75  
76  // This is set to true when Process::PreventCoreFiles() is called.
77  static bool coreFilesPrevented = false;
78  
AreCoreFilesPrevented()79  bool Process::AreCoreFilesPrevented() {
80    return coreFilesPrevented;
81  }
82  
83  // Include the platform-specific parts of this class.
84  #ifdef LLVM_ON_UNIX
85  #include "Unix/Process.inc"
86  #endif
87  #ifdef LLVM_ON_WIN32
88  #include "Windows/Process.inc"
89  #endif
90