diff options
Diffstat (limited to 'llvm/lib/System/Unix')
| -rw-r--r-- | llvm/lib/System/Unix/Alarm.inc | 72 | ||||
| -rw-r--r-- | llvm/lib/System/Unix/Host.inc | 96 | ||||
| -rw-r--r-- | llvm/lib/System/Unix/Memory.inc | 151 | ||||
| -rw-r--r-- | llvm/lib/System/Unix/Mutex.inc | 43 | ||||
| -rw-r--r-- | llvm/lib/System/Unix/Path.inc | 896 | ||||
| -rw-r--r-- | llvm/lib/System/Unix/Process.inc | 295 | ||||
| -rw-r--r-- | llvm/lib/System/Unix/Program.inc | 422 | ||||
| -rw-r--r-- | llvm/lib/System/Unix/README.txt | 16 | ||||
| -rw-r--r-- | llvm/lib/System/Unix/RWMutex.inc | 43 | ||||
| -rw-r--r-- | llvm/lib/System/Unix/Signals.inc | 303 | ||||
| -rw-r--r-- | llvm/lib/System/Unix/ThreadLocal.inc | 26 | ||||
| -rw-r--r-- | llvm/lib/System/Unix/TimeValue.inc | 56 | ||||
| -rw-r--r-- | llvm/lib/System/Unix/Unix.h | 87 | ||||
| -rw-r--r-- | llvm/lib/System/Unix/system_error.inc | 34 | 
14 files changed, 0 insertions, 2540 deletions
diff --git a/llvm/lib/System/Unix/Alarm.inc b/llvm/lib/System/Unix/Alarm.inc deleted file mode 100644 index fb42b6c65da..00000000000 --- a/llvm/lib/System/Unix/Alarm.inc +++ /dev/null @@ -1,72 +0,0 @@ -//===-- Alarm.inc - Implement Unix Alarm Support ----------------*- C++ -*-===// -// -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the UNIX Alarm support. -// -//===----------------------------------------------------------------------===// - -#include <signal.h> -#include <unistd.h> -#include <cassert> -using namespace llvm; - -/// AlarmCancelled - This flag is set by the SIGINT signal handler if the -/// user presses CTRL-C. -static volatile bool AlarmCancelled = false; - -/// AlarmTriggered - This flag is set by the SIGALRM signal handler if the -/// alarm was triggered. -static volatile bool AlarmTriggered = false; - -/// NestedSOI - Sanity check.  Alarms cannot be nested or run in parallel. -/// This ensures that they never do. -static bool NestedSOI = false; - -static RETSIGTYPE SigIntHandler(int Sig) { -  AlarmCancelled = true; -  signal(SIGINT, SigIntHandler); -} - -static RETSIGTYPE SigAlarmHandler(int Sig) { -  AlarmTriggered = true; -} - -static void (*OldSigIntHandler) (int); - -void sys::SetupAlarm(unsigned seconds) { -  assert(!NestedSOI && "sys::SetupAlarm calls cannot be nested!"); -  NestedSOI = true; -  AlarmCancelled = false; -  AlarmTriggered = false; -  ::signal(SIGALRM, SigAlarmHandler); -  OldSigIntHandler = ::signal(SIGINT, SigIntHandler); -  ::alarm(seconds); -} - -void sys::TerminateAlarm() { -  assert(NestedSOI && "sys::TerminateAlarm called without sys::SetupAlarm!"); -  ::alarm(0); -  ::signal(SIGALRM, SIG_DFL); -  ::signal(SIGINT, OldSigIntHandler); -  AlarmCancelled = false; -  AlarmTriggered = false; -  NestedSOI = false; -} - -int sys::AlarmStatus() { -  if (AlarmCancelled) -    return -1; -  if (AlarmTriggered) -    return 1; -  return 0; -} - -void sys::Sleep(unsigned n) { -  ::sleep(n); -} diff --git a/llvm/lib/System/Unix/Host.inc b/llvm/lib/System/Unix/Host.inc deleted file mode 100644 index c76d6a4e18f..00000000000 --- a/llvm/lib/System/Unix/Host.inc +++ /dev/null @@ -1,96 +0,0 @@ - //===- llvm/System/Unix/Host.inc -------------------------------*- C++ -*-===// -// -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the UNIX Host support. -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic UNIX code that -//===          is guaranteed to work on *all* UNIX variants. -//===----------------------------------------------------------------------===// - -#include "llvm/Config/config.h" -#include "llvm/ADT/StringRef.h" -#include "Unix.h" -#include <sys/utsname.h> -#include <string> - -using namespace llvm; - -static std::string getOSVersion() { -  struct utsname info; - -  if (uname(&info)) -    return ""; - -  return info.release; -} - -std::string sys::getHostTriple() { -  // FIXME: Derive directly instead of relying on the autoconf generated -  // variable. - -  StringRef HostTripleString(LLVM_HOSTTRIPLE); -  std::pair<StringRef, StringRef> ArchSplit = HostTripleString.split('-'); -   -  // Normalize the arch, since the host triple may not actually match the host. -  std::string Arch = ArchSplit.first; - -  // It would be nice to do this in terms of llvm::Triple, but that is in -  // Support which is layered above us. -#if defined(__x86_64__) -  Arch = "x86_64"; -#elif defined(__i386__) -  Arch = "i386"; -#elif defined(__ppc64__) -  Arch = "powerpc64"; -#elif defined(__ppc__) -  Arch = "powerpc"; -#elif defined(__arm__) - -  // FIXME: We need to pick the right ARM triple (which involves querying the -  // chip). However, for now this is most important for LLVM arch selection, so -  // we only need to make sure to distinguish ARM and Thumb. -#  if defined(__thumb__) -  Arch = "thumb"; -#  else -  Arch = "arm"; -#  endif - -#else - -  // FIXME: When enough auto-detection is in place, this should just -  // #error. Then at least the arch selection is done, and we only need the OS -  // etc selection to kill off the use of LLVM_HOSTTRIPLE. - -#endif - -  std::string Triple(Arch); -  Triple += '-'; -  Triple += ArchSplit.second; - -  // Force i<N>86 to i386. -  if (Triple[0] == 'i' && isdigit(Triple[1]) &&  -      Triple[2] == '8' && Triple[3] == '6') -    Triple[1] = '3'; - -  // On darwin, we want to update the version to match that of the -  // host.     -  std::string::size_type DarwinDashIdx = Triple.find("-darwin"); -  if (DarwinDashIdx != std::string::npos) { -    Triple.resize(DarwinDashIdx + strlen("-darwin")); -     -    // Only add the major part of the os version. -    std::string Version = getOSVersion(); -    Triple += Version.substr(0, Version.find('.')); -  } - -  return Triple; -} diff --git a/llvm/lib/System/Unix/Memory.inc b/llvm/lib/System/Unix/Memory.inc deleted file mode 100644 index 1b038f9c6e0..00000000000 --- a/llvm/lib/System/Unix/Memory.inc +++ /dev/null @@ -1,151 +0,0 @@ -//===- Unix/Memory.cpp - Generic UNIX System Configuration ------*- C++ -*-===// -//  -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -//  -//===----------------------------------------------------------------------===// -// -// This file defines some functions for various memory management utilities. -// -//===----------------------------------------------------------------------===// - -#include "Unix.h" -#include "llvm/System/DataTypes.h" -#include "llvm/System/Process.h" - -#ifdef HAVE_SYS_MMAN_H -#include <sys/mman.h> -#endif - -#ifdef __APPLE__ -#include <mach/mach.h> -#endif - -/// AllocateRWX - Allocate a slab of memory with read/write/execute -/// permissions.  This is typically used for JIT applications where we want -/// to emit code to the memory then jump to it.  Getting this type of memory -/// is very OS specific. -/// -llvm::sys::MemoryBlock  -llvm::sys::Memory::AllocateRWX(size_t NumBytes, const MemoryBlock* NearBlock, -                               std::string *ErrMsg) { -  if (NumBytes == 0) return MemoryBlock(); - -  size_t pageSize = Process::GetPageSize(); -  size_t NumPages = (NumBytes+pageSize-1)/pageSize; - -  int fd = -1; -#ifdef NEED_DEV_ZERO_FOR_MMAP -  static int zero_fd = open("/dev/zero", O_RDWR); -  if (zero_fd == -1) { -    MakeErrMsg(ErrMsg, "Can't open /dev/zero device"); -    return MemoryBlock(); -  } -  fd = zero_fd; -#endif - -  int flags = MAP_PRIVATE | -#ifdef HAVE_MMAP_ANONYMOUS -  MAP_ANONYMOUS -#else -  MAP_ANON -#endif -  ; - -  void* start = NearBlock ? (unsigned char*)NearBlock->base() +  -                            NearBlock->size() : 0; - -#if defined(__APPLE__) && defined(__arm__) -  void *pa = ::mmap(start, pageSize*NumPages, PROT_READ|PROT_EXEC, -                    flags, fd, 0); -#else -  void *pa = ::mmap(start, pageSize*NumPages, PROT_READ|PROT_WRITE|PROT_EXEC, -                    flags, fd, 0); -#endif -  if (pa == MAP_FAILED) { -    if (NearBlock) //Try again without a near hint -      return AllocateRWX(NumBytes, 0); - -    MakeErrMsg(ErrMsg, "Can't allocate RWX Memory"); -    return MemoryBlock(); -  } - -#if defined(__APPLE__) && defined(__arm__) -  kern_return_t kr = vm_protect(mach_task_self(), (vm_address_t)pa, -                                (vm_size_t)(pageSize*NumPages), 0, -                                VM_PROT_READ | VM_PROT_EXECUTE | VM_PROT_COPY); -  if (KERN_SUCCESS != kr) { -    MakeErrMsg(ErrMsg, "vm_protect max RX failed"); -    return sys::MemoryBlock(); -  } - -  kr = vm_protect(mach_task_self(), (vm_address_t)pa, -                  (vm_size_t)(pageSize*NumPages), 0, -                  VM_PROT_READ | VM_PROT_WRITE); -  if (KERN_SUCCESS != kr) { -    MakeErrMsg(ErrMsg, "vm_protect RW failed"); -    return sys::MemoryBlock(); -  } -#endif - -  MemoryBlock result; -  result.Address = pa; -  result.Size = NumPages*pageSize; - -  return result; -} - -bool llvm::sys::Memory::ReleaseRWX(MemoryBlock &M, std::string *ErrMsg) { -  if (M.Address == 0 || M.Size == 0) return false; -  if (0 != ::munmap(M.Address, M.Size)) -    return MakeErrMsg(ErrMsg, "Can't release RWX Memory"); -  return false; -} - -bool llvm::sys::Memory::setWritable (MemoryBlock &M, std::string *ErrMsg) { -#if defined(__APPLE__) && defined(__arm__) -  if (M.Address == 0 || M.Size == 0) return false; -  sys::Memory::InvalidateInstructionCache(M.Address, M.Size); -  kern_return_t kr = vm_protect(mach_task_self(), (vm_address_t)M.Address, -    (vm_size_t)M.Size, 0, VM_PROT_READ | VM_PROT_WRITE); -  return KERN_SUCCESS == kr; -#else -  return true; -#endif -} - -bool llvm::sys::Memory::setExecutable (MemoryBlock &M, std::string *ErrMsg) { -#if defined(__APPLE__) && defined(__arm__) -  if (M.Address == 0 || M.Size == 0) return false; -  sys::Memory::InvalidateInstructionCache(M.Address, M.Size); -  kern_return_t kr = vm_protect(mach_task_self(), (vm_address_t)M.Address, -    (vm_size_t)M.Size, 0, VM_PROT_READ | VM_PROT_EXECUTE | VM_PROT_COPY); -  return KERN_SUCCESS == kr; -#else -  return false; -#endif -} - -bool llvm::sys::Memory::setRangeWritable(const void *Addr, size_t Size) { -#if defined(__APPLE__) && defined(__arm__) -  kern_return_t kr = vm_protect(mach_task_self(), (vm_address_t)Addr, -                                (vm_size_t)Size, 0, -                                VM_PROT_READ | VM_PROT_WRITE); -  return KERN_SUCCESS == kr; -#else -  return true; -#endif -} - -bool llvm::sys::Memory::setRangeExecutable(const void *Addr, size_t Size) { -#if defined(__APPLE__) && defined(__arm__) -  kern_return_t kr = vm_protect(mach_task_self(), (vm_address_t)Addr, -                                (vm_size_t)Size, 0, -                                VM_PROT_READ | VM_PROT_EXECUTE | VM_PROT_COPY); -  return KERN_SUCCESS == kr; -#else -  return true; -#endif -} diff --git a/llvm/lib/System/Unix/Mutex.inc b/llvm/lib/System/Unix/Mutex.inc deleted file mode 100644 index 4a5e28de27b..00000000000 --- a/llvm/lib/System/Unix/Mutex.inc +++ /dev/null @@ -1,43 +0,0 @@ -//===- llvm/System/Unix/Mutex.inc - Unix Mutex Implementation ---*- C++ -*-===// -//  -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -//  -//===----------------------------------------------------------------------===// -// -// This file implements the Unix specific (non-pthread) Mutex class. -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic UNIX code that -//===          is guaranteed to work on *all* UNIX variants. -//===----------------------------------------------------------------------===// - -namespace llvm -{ -using namespace sys; - -MutexImpl::MutexImpl( bool recursive) -{ -} - -MutexImpl::~MutexImpl() -{ -} - -bool  -MutexImpl::release() -{ -  return true; -} - -bool  -MutexImpl::tryacquire( void ) -{ -  return true; -} - -} diff --git a/llvm/lib/System/Unix/Path.inc b/llvm/lib/System/Unix/Path.inc deleted file mode 100644 index 5ee3adc4d2d..00000000000 --- a/llvm/lib/System/Unix/Path.inc +++ /dev/null @@ -1,896 +0,0 @@ -//===- llvm/System/Unix/Path.cpp - Unix Path Implementation -----*- C++ -*-===// -// -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the Unix specific portion of the Path class. -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic UNIX code that -//===          is guaranteed to work on *all* UNIX variants. -//===----------------------------------------------------------------------===// - -#include "Unix.h" -#if HAVE_SYS_STAT_H -#include <sys/stat.h> -#endif -#if HAVE_FCNTL_H -#include <fcntl.h> -#endif -#ifdef HAVE_SYS_MMAN_H -#include <sys/mman.h> -#endif -#ifdef HAVE_SYS_STAT_H -#include <sys/stat.h> -#endif -#if HAVE_UTIME_H -#include <utime.h> -#endif -#if HAVE_TIME_H -#include <time.h> -#endif -#if HAVE_DIRENT_H -# include <dirent.h> -# define NAMLEN(dirent) strlen((dirent)->d_name) -#else -# define dirent direct -# define NAMLEN(dirent) (dirent)->d_namlen -# if HAVE_SYS_NDIR_H -#  include <sys/ndir.h> -# endif -# if HAVE_SYS_DIR_H -#  include <sys/dir.h> -# endif -# if HAVE_NDIR_H -#  include <ndir.h> -# endif -#endif - -#if HAVE_DLFCN_H -#include <dlfcn.h> -#endif - -#ifdef __APPLE__ -#include <mach-o/dyld.h> -#endif - -// Put in a hack for Cygwin which falsely reports that the mkdtemp function -// is available when it is not. -#ifdef __CYGWIN__ -# undef HAVE_MKDTEMP -#endif - -namespace { -inline bool lastIsSlash(const std::string& path) { -  return !path.empty() && path[path.length() - 1] == '/'; -} - -} - -namespace llvm { -using namespace sys; - -const char sys::PathSeparator = ':'; - -StringRef Path::GetEXESuffix() { -  return StringRef(); -} - -Path::Path(StringRef p) -  : path(p) {} - -Path::Path(const char *StrStart, unsigned StrLen) -  : path(StrStart, StrLen) {} - -Path& -Path::operator=(StringRef that) { -  path.assign(that.data(), that.size()); -  return *this; -} - -bool -Path::isValid() const { -  // Empty paths are considered invalid here. -  // This code doesn't check MAXPATHLEN because there's no need. Nothing in -  // LLVM manipulates Paths with fixed-sizes arrays, and if the OS can't -  // handle names longer than some limit, it'll report this on demand using -  // ENAMETOLONG. -  return !path.empty(); -} - -bool -Path::isAbsolute(const char *NameStart, unsigned NameLen) { -  assert(NameStart); -  if (NameLen == 0) -    return false; -  return NameStart[0] == '/'; -} - -bool -Path::isAbsolute() const { -  if (path.empty()) -    return false; -  return path[0] == '/'; -} - -void Path::makeAbsolute() { -  if (isAbsolute()) -    return; - -  Path CWD = Path::GetCurrentDirectory(); -  assert(CWD.isAbsolute() && "GetCurrentDirectory returned relative path!"); - -  CWD.appendComponent(path); - -  path = CWD.str(); -} - -Path -Path::GetRootDirectory() { -  Path result; -  result.set("/"); -  return result; -} - -Path -Path::GetTemporaryDirectory(std::string *ErrMsg) { -#if defined(HAVE_MKDTEMP) -  // The best way is with mkdtemp but that's not available on many systems, -  // Linux and FreeBSD have it. Others probably won't. -  char pathname[] = "/tmp/llvm_XXXXXX"; -  if (0 == mkdtemp(pathname)) { -    MakeErrMsg(ErrMsg, -               std::string(pathname) + ": can't create temporary directory"); -    return Path(); -  } -  return Path(pathname); -#elif defined(HAVE_MKSTEMP) -  // If no mkdtemp is available, mkstemp can be used to create a temporary file -  // which is then removed and created as a directory. We prefer this over -  // mktemp because of mktemp's inherent security and threading risks. We still -  // have a slight race condition from the time the temporary file is created to -  // the time it is re-created as a directoy. -  char pathname[] = "/tmp/llvm_XXXXXX"; -  int fd = 0; -  if (-1 == (fd = mkstemp(pathname))) { -    MakeErrMsg(ErrMsg, -      std::string(pathname) + ": can't create temporary directory"); -    return Path(); -  } -  ::close(fd); -  ::unlink(pathname); // start race condition, ignore errors -  if (-1 == ::mkdir(pathname, S_IRWXU)) { // end race condition -    MakeErrMsg(ErrMsg, -      std::string(pathname) + ": can't create temporary directory"); -    return Path(); -  } -  return Path(pathname); -#elif defined(HAVE_MKTEMP) -  // If a system doesn't have mkdtemp(3) or mkstemp(3) but it does have -  // mktemp(3) then we'll assume that system (e.g. AIX) has a reasonable -  // implementation of mktemp(3) and doesn't follow BSD 4.3's lead of replacing -  // the XXXXXX with the pid of the process and a letter. That leads to only -  // twenty six temporary files that can be generated. -  char pathname[] = "/tmp/llvm_XXXXXX"; -  char *TmpName = ::mktemp(pathname); -  if (TmpName == 0) { -    MakeErrMsg(ErrMsg, -      std::string(TmpName) + ": can't create unique directory name"); -    return Path(); -  } -  if (-1 == ::mkdir(TmpName, S_IRWXU)) { -    MakeErrMsg(ErrMsg, -        std::string(TmpName) + ": can't create temporary directory"); -    return Path(); -  } -  return Path(TmpName); -#else -  // This is the worst case implementation. tempnam(3) leaks memory unless its -  // on an SVID2 (or later) system. On BSD 4.3 it leaks. tmpnam(3) has thread -  // issues. The mktemp(3) function doesn't have enough variability in the -  // temporary name generated. So, we provide our own implementation that -  // increments an integer from a random number seeded by the current time. This -  // should be sufficiently unique that we don't have many collisions between -  // processes. Generally LLVM processes don't run very long and don't use very -  // many temporary files so this shouldn't be a big issue for LLVM. -  static time_t num = ::time(0); -  char pathname[MAXPATHLEN]; -  do { -    num++; -    sprintf(pathname, "/tmp/llvm_%010u", unsigned(num)); -  } while ( 0 == access(pathname, F_OK ) ); -  if (-1 == ::mkdir(pathname, S_IRWXU)) { -    MakeErrMsg(ErrMsg, -      std::string(pathname) + ": can't create temporary directory"); -    return Path(); -  } -  return Path(pathname); -#endif -} - -void -Path::GetSystemLibraryPaths(std::vector<sys::Path>& Paths) { -#ifdef LTDL_SHLIBPATH_VAR -  char* env_var = getenv(LTDL_SHLIBPATH_VAR); -  if (env_var != 0) { -    getPathList(env_var,Paths); -  } -#endif -  // FIXME: Should this look at LD_LIBRARY_PATH too? -  Paths.push_back(sys::Path("/usr/local/lib/")); -  Paths.push_back(sys::Path("/usr/X11R6/lib/")); -  Paths.push_back(sys::Path("/usr/lib/")); -  Paths.push_back(sys::Path("/lib/")); -} - -void -Path::GetBitcodeLibraryPaths(std::vector<sys::Path>& Paths) { -  char * env_var = getenv("LLVM_LIB_SEARCH_PATH"); -  if (env_var != 0) { -    getPathList(env_var,Paths); -  } -#ifdef LLVM_LIBDIR -  { -    Path tmpPath; -    if (tmpPath.set(LLVM_LIBDIR)) -      if (tmpPath.canRead()) -        Paths.push_back(tmpPath); -  } -#endif -  GetSystemLibraryPaths(Paths); -} - -Path -Path::GetLLVMDefaultConfigDir() { -  return Path("/etc/llvm/"); -} - -Path -Path::GetUserHomeDirectory() { -  const char* home = getenv("HOME"); -  if (home) { -    Path result; -    if (result.set(home)) -      return result; -  } -  return GetRootDirectory(); -} - -Path -Path::GetCurrentDirectory() { -  char pathname[MAXPATHLEN]; -  if (!getcwd(pathname,MAXPATHLEN)) { -    assert (false && "Could not query current working directory."); -    return Path(); -  } - -  return Path(pathname); -} - -#if defined(__FreeBSD__) || defined (__NetBSD__) || defined(__minix) -static int -test_dir(char buf[PATH_MAX], char ret[PATH_MAX], -    const char *dir, const char *bin) -{ -  struct stat sb; - -  snprintf(buf, PATH_MAX, "%s/%s", dir, bin); -  if (realpath(buf, ret) == NULL) -    return (1); -  if (stat(buf, &sb) != 0) -    return (1); - -  return (0); -} - -static char * -getprogpath(char ret[PATH_MAX], const char *bin) -{ -  char *pv, *s, *t, buf[PATH_MAX]; - -  /* First approach: absolute path. */ -  if (bin[0] == '/') { -    if (test_dir(buf, ret, "/", bin) == 0) -      return (ret); -    return (NULL); -  } - -  /* Second approach: relative path. */ -  if (strchr(bin, '/') != NULL) { -    if (getcwd(buf, PATH_MAX) == NULL) -      return (NULL); -    if (test_dir(buf, ret, buf, bin) == 0) -      return (ret); -    return (NULL); -  } - -  /* Third approach: $PATH */ -  if ((pv = getenv("PATH")) == NULL) -    return (NULL); -  s = pv = strdup(pv); -  if (pv == NULL) -    return (NULL); -  while ((t = strsep(&s, ":")) != NULL) { -    if (test_dir(buf, ret, t, bin) == 0) { -      free(pv); -      return (ret); -    } -  } -  free(pv); -  return (NULL); -} -#endif // __FreeBSD__ || __NetBSD__ - -/// GetMainExecutable - Return the path to the main executable, given the -/// value of argv[0] from program startup. -Path Path::GetMainExecutable(const char *argv0, void *MainAddr) { -#if defined(__APPLE__) -  // On OS X the executable path is saved to the stack by dyld. Reading it -  // from there is much faster than calling dladdr, especially for large -  // binaries with symbols. -  char exe_path[MAXPATHLEN]; -  uint32_t size = sizeof(exe_path); -  if (_NSGetExecutablePath(exe_path, &size) == 0) { -    char link_path[MAXPATHLEN]; -    if (realpath(exe_path, link_path)) -      return Path(link_path); -  } -#elif defined(__FreeBSD__) || defined (__NetBSD__) || defined(__minix) -  char exe_path[PATH_MAX]; - -  if (getprogpath(exe_path, argv0) != NULL) -    return Path(exe_path); -#elif defined(__linux__) || defined(__CYGWIN__) -  char exe_path[MAXPATHLEN]; -  ssize_t len = readlink("/proc/self/exe", exe_path, sizeof(exe_path)); -  if (len >= 0) -    return Path(StringRef(exe_path, len)); -#elif defined(HAVE_DLFCN_H) -  // Use dladdr to get executable path if available. -  Dl_info DLInfo; -  int err = dladdr(MainAddr, &DLInfo); -  if (err == 0) -    return Path(); - -  // If the filename is a symlink, we need to resolve and return the location of -  // the actual executable. -  char link_path[MAXPATHLEN]; -  if (realpath(DLInfo.dli_fname, link_path)) -    return Path(link_path); -#else -#error GetMainExecutable is not implemented on this host yet. -#endif -  return Path(); -} - - -StringRef Path::getDirname() const { -  return getDirnameCharSep(path, "/"); -} - -StringRef -Path::getBasename() const { -  // Find the last slash -  std::string::size_type slash = path.rfind('/'); -  if (slash == std::string::npos) -    slash = 0; -  else -    slash++; - -  std::string::size_type dot = path.rfind('.'); -  if (dot == std::string::npos || dot < slash) -    return StringRef(path).substr(slash); -  else -    return StringRef(path).substr(slash, dot - slash); -} - -StringRef -Path::getSuffix() const { -  // Find the last slash -  std::string::size_type slash = path.rfind('/'); -  if (slash == std::string::npos) -    slash = 0; -  else -    slash++; - -  std::string::size_type dot = path.rfind('.'); -  if (dot == std::string::npos || dot < slash) -    return StringRef(); -  else -    return StringRef(path).substr(dot + 1); -} - -bool Path::getMagicNumber(std::string &Magic, unsigned len) const { -  assert(len < 1024 && "Request for magic string too long"); -  char Buf[1025]; -  int fd = ::open(path.c_str(), O_RDONLY); -  if (fd < 0) -    return false; -  ssize_t bytes_read = ::read(fd, Buf, len); -  ::close(fd); -  if (ssize_t(len) != bytes_read) -    return false; -  Magic.assign(Buf, len); -  return true; -} - -bool -Path::exists() const { -  return 0 == access(path.c_str(), F_OK ); -} - -bool -Path::isDirectory() const { -  struct stat buf; -  if (0 != stat(path.c_str(), &buf)) -    return false; -  return ((buf.st_mode & S_IFMT) == S_IFDIR) ? true : false; -} - -bool -Path::isSymLink() const { -  struct stat buf; -  if (0 != lstat(path.c_str(), &buf)) -    return false; -  return S_ISLNK(buf.st_mode); -} - - -bool -Path::canRead() const { -  return 0 == access(path.c_str(), R_OK); -} - -bool -Path::canWrite() const { -  return 0 == access(path.c_str(), W_OK); -} - -bool -Path::isRegularFile() const { -  // Get the status so we can determine if it's a file or directory -  struct stat buf; - -  if (0 != stat(path.c_str(), &buf)) -    return false; - -  if (S_ISREG(buf.st_mode)) -    return true; - -  return false; -} - -bool -Path::canExecute() const { -  if (0 != access(path.c_str(), R_OK | X_OK )) -    return false; -  struct stat buf; -  if (0 != stat(path.c_str(), &buf)) -    return false; -  if (!S_ISREG(buf.st_mode)) -    return false; -  return true; -} - -StringRef -Path::getLast() const { -  // Find the last slash -  size_t pos = path.rfind('/'); - -  // Handle the corner cases -  if (pos == std::string::npos) -    return path; - -  // If the last character is a slash -  if (pos == path.length()-1) { -    // Find the second to last slash -    size_t pos2 = path.rfind('/', pos-1); -    if (pos2 == std::string::npos) -      return StringRef(path).substr(0,pos); -    else -      return StringRef(path).substr(pos2+1,pos-pos2-1); -  } -  // Return everything after the last slash -  return StringRef(path).substr(pos+1); -} - -const FileStatus * -PathWithStatus::getFileStatus(bool update, std::string *ErrStr) const { -  if (!fsIsValid || update) { -    struct stat buf; -    if (0 != stat(path.c_str(), &buf)) { -      MakeErrMsg(ErrStr, path + ": can't get status of file"); -      return 0; -    } -    status.fileSize = buf.st_size; -    status.modTime.fromEpochTime(buf.st_mtime); -    status.mode = buf.st_mode; -    status.user = buf.st_uid; -    status.group = buf.st_gid; -    status.uniqueID = uint64_t(buf.st_ino); -    status.isDir  = S_ISDIR(buf.st_mode); -    status.isFile = S_ISREG(buf.st_mode); -    fsIsValid = true; -  } -  return &status; -} - -static bool AddPermissionBits(const Path &File, int bits) { -  // Get the umask value from the operating system.  We want to use it -  // when changing the file's permissions. Since calling umask() sets -  // the umask and returns its old value, we must call it a second -  // time to reset it to the user's preference. -  int mask = umask(0777); // The arg. to umask is arbitrary. -  umask(mask);            // Restore the umask. - -  // Get the file's current mode. -  struct stat buf; -  if (0 != stat(File.c_str(), &buf)) -    return false; -  // Change the file to have whichever permissions bits from 'bits' -  // that the umask would not disable. -  if ((chmod(File.c_str(), (buf.st_mode | (bits & ~mask)))) == -1) -      return false; -  return true; -} - -bool Path::makeReadableOnDisk(std::string* ErrMsg) { -  if (!AddPermissionBits(*this, 0444)) -    return MakeErrMsg(ErrMsg, path + ": can't make file readable"); -  return false; -} - -bool Path::makeWriteableOnDisk(std::string* ErrMsg) { -  if (!AddPermissionBits(*this, 0222)) -    return MakeErrMsg(ErrMsg, path + ": can't make file writable"); -  return false; -} - -bool Path::makeExecutableOnDisk(std::string* ErrMsg) { -  if (!AddPermissionBits(*this, 0111)) -    return MakeErrMsg(ErrMsg, path + ": can't make file executable"); -  return false; -} - -bool -Path::getDirectoryContents(std::set<Path>& result, std::string* ErrMsg) const { -  DIR* direntries = ::opendir(path.c_str()); -  if (direntries == 0) -    return MakeErrMsg(ErrMsg, path + ": can't open directory"); - -  std::string dirPath = path; -  if (!lastIsSlash(dirPath)) -    dirPath += '/'; - -  result.clear(); -  struct dirent* de = ::readdir(direntries); -  for ( ; de != 0; de = ::readdir(direntries)) { -    if (de->d_name[0] != '.') { -      Path aPath(dirPath + (const char*)de->d_name); -      struct stat st; -      if (0 != lstat(aPath.path.c_str(), &st)) { -        if (S_ISLNK(st.st_mode)) -          continue; // dangling symlink -- ignore -        return MakeErrMsg(ErrMsg, -                          aPath.path +  ": can't determine file object type"); -      } -      result.insert(aPath); -    } -  } - -  closedir(direntries); -  return false; -} - -bool -Path::set(StringRef a_path) { -  if (a_path.empty()) -    return false; -  path = a_path; -  return true; -} - -bool -Path::appendComponent(StringRef name) { -  if (name.empty()) -    return false; -  if (!lastIsSlash(path)) -    path += '/'; -  path += name; -  return true; -} - -bool -Path::eraseComponent() { -  size_t slashpos = path.rfind('/',path.size()); -  if (slashpos == 0 || slashpos == std::string::npos) { -    path.erase(); -    return true; -  } -  if (slashpos == path.size() - 1) -    slashpos = path.rfind('/',slashpos-1); -  if (slashpos == std::string::npos) { -    path.erase(); -    return true; -  } -  path.erase(slashpos); -  return true; -} - -bool -Path::eraseSuffix() { -  size_t dotpos = path.rfind('.',path.size()); -  size_t slashpos = path.rfind('/',path.size()); -  if (dotpos != std::string::npos) { -    if (slashpos == std::string::npos || dotpos > slashpos+1) { -      path.erase(dotpos, path.size()-dotpos); -      return true; -    } -  } -  return false; -} - -static bool createDirectoryHelper(char* beg, char* end, bool create_parents) { - -  if (access(beg, R_OK | W_OK) == 0) -    return false; - -  if (create_parents) { - -    char* c = end; - -    for (; c != beg; --c) -      if (*c == '/') { - -        // Recurse to handling the parent directory. -        *c = '\0'; -        bool x = createDirectoryHelper(beg, c, create_parents); -        *c = '/'; - -        // Return if we encountered an error. -        if (x) -          return true; - -        break; -      } -  } - -  return mkdir(beg, S_IRWXU | S_IRWXG) != 0; -} - -bool -Path::createDirectoryOnDisk( bool create_parents, std::string* ErrMsg ) { -  // Get a writeable copy of the path name -  std::string pathname(path); - -  // Null-terminate the last component -  size_t lastchar = path.length() - 1 ; - -  if (pathname[lastchar] != '/') -    ++lastchar; - -  pathname[lastchar] = '\0'; - -  if (createDirectoryHelper(&pathname[0], &pathname[lastchar], create_parents)) -    return MakeErrMsg(ErrMsg, pathname + ": can't create directory"); - -  return false; -} - -bool -Path::createFileOnDisk(std::string* ErrMsg) { -  // Create the file -  int fd = ::creat(path.c_str(), S_IRUSR | S_IWUSR); -  if (fd < 0) -    return MakeErrMsg(ErrMsg, path + ": can't create file"); -  ::close(fd); -  return false; -} - -bool -Path::createTemporaryFileOnDisk(bool reuse_current, std::string* ErrMsg) { -  // Make this into a unique file name -  if (makeUnique( reuse_current, ErrMsg )) -    return true; - -  // create the file -  int fd = ::open(path.c_str(), O_WRONLY|O_CREAT|O_TRUNC, 0666); -  if (fd < 0) -    return MakeErrMsg(ErrMsg, path + ": can't create temporary file"); -  ::close(fd); -  return false; -} - -bool -Path::eraseFromDisk(bool remove_contents, std::string *ErrStr) const { -  // Get the status so we can determine if it's a file or directory. -  struct stat buf; -  if (0 != stat(path.c_str(), &buf)) { -    MakeErrMsg(ErrStr, path + ": can't get status of file"); -    return true; -  } - -  // Note: this check catches strange situations. In all cases, LLVM should -  // only be involved in the creation and deletion of regular files.  This -  // check ensures that what we're trying to erase is a regular file. It -  // effectively prevents LLVM from erasing things like /dev/null, any block -  // special file, or other things that aren't "regular" files. -  if (S_ISREG(buf.st_mode)) { -    if (unlink(path.c_str()) != 0) -      return MakeErrMsg(ErrStr, path + ": can't destroy file"); -    return false; -  } - -  if (!S_ISDIR(buf.st_mode)) { -    if (ErrStr) *ErrStr = "not a file or directory"; -    return true; -  } - -  if (remove_contents) { -    // Recursively descend the directory to remove its contents. -    std::string cmd = "/bin/rm -rf " + path; -    if (system(cmd.c_str()) != 0) { -      MakeErrMsg(ErrStr, path + ": failed to recursively remove directory."); -      return true; -    } -    return false; -  } - -  // Otherwise, try to just remove the one directory. -  std::string pathname(path); -  size_t lastchar = path.length() - 1; -  if (pathname[lastchar] == '/') -    pathname[lastchar] = '\0'; -  else -    pathname[lastchar+1] = '\0'; - -  if (rmdir(pathname.c_str()) != 0) -    return MakeErrMsg(ErrStr, pathname + ": can't erase directory"); -  return false; -} - -bool -Path::renamePathOnDisk(const Path& newName, std::string* ErrMsg) { -  if (0 != ::rename(path.c_str(), newName.c_str())) -    return MakeErrMsg(ErrMsg, std::string("can't rename '") + path + "' as '" + -               newName.str() + "'"); -  return false; -} - -bool -Path::setStatusInfoOnDisk(const FileStatus &si, std::string *ErrStr) const { -  struct utimbuf utb; -  utb.actime = si.modTime.toPosixTime(); -  utb.modtime = utb.actime; -  if (0 != ::utime(path.c_str(),&utb)) -    return MakeErrMsg(ErrStr, path + ": can't set file modification time"); -  if (0 != ::chmod(path.c_str(),si.mode)) -    return MakeErrMsg(ErrStr, path + ": can't set mode"); -  return false; -} - -bool -sys::CopyFile(const sys::Path &Dest, const sys::Path &Src, std::string* ErrMsg){ -  int inFile = -1; -  int outFile = -1; -  inFile = ::open(Src.c_str(), O_RDONLY); -  if (inFile == -1) -    return MakeErrMsg(ErrMsg, Src.str() + -      ": can't open source file to copy"); - -  outFile = ::open(Dest.c_str(), O_WRONLY|O_CREAT, 0666); -  if (outFile == -1) { -    ::close(inFile); -    return MakeErrMsg(ErrMsg, Dest.str() + -      ": can't create destination file for copy"); -  } - -  char Buffer[16*1024]; -  while (ssize_t Amt = ::read(inFile, Buffer, 16*1024)) { -    if (Amt == -1) { -      if (errno != EINTR && errno != EAGAIN) { -        ::close(inFile); -        ::close(outFile); -        return MakeErrMsg(ErrMsg, Src.str()+": can't read source file"); -      } -    } else { -      char *BufPtr = Buffer; -      while (Amt) { -        ssize_t AmtWritten = ::write(outFile, BufPtr, Amt); -        if (AmtWritten == -1) { -          if (errno != EINTR && errno != EAGAIN) { -            ::close(inFile); -            ::close(outFile); -            return MakeErrMsg(ErrMsg, Dest.str() + -              ": can't write destination file"); -          } -        } else { -          Amt -= AmtWritten; -          BufPtr += AmtWritten; -        } -      } -    } -  } -  ::close(inFile); -  ::close(outFile); -  return false; -} - -bool -Path::makeUnique(bool reuse_current, std::string* ErrMsg) { -  if (reuse_current && !exists()) -    return false; // File doesn't exist already, just use it! - -  // Append an XXXXXX pattern to the end of the file for use with mkstemp, -  // mktemp or our own implementation. -  // This uses std::vector instead of SmallVector to avoid a dependence on -  // libSupport. And performance isn't critical here. -  std::vector<char> Buf; -  Buf.resize(path.size()+8); -  char *FNBuffer = &Buf[0]; -    path.copy(FNBuffer,path.size()); -  if (isDirectory()) -    strcpy(FNBuffer+path.size(), "/XXXXXX"); -  else -    strcpy(FNBuffer+path.size(), "-XXXXXX"); - -#if defined(HAVE_MKSTEMP) -  int TempFD; -  if ((TempFD = mkstemp(FNBuffer)) == -1) -    return MakeErrMsg(ErrMsg, path + ": can't make unique filename"); - -  // We don't need to hold the temp file descriptor... we will trust that no one -  // will overwrite/delete the file before we can open it again. -  close(TempFD); - -  // Save the name -  path = FNBuffer; -#elif defined(HAVE_MKTEMP) -  // If we don't have mkstemp, use the old and obsolete mktemp function. -  if (mktemp(FNBuffer) == 0) -    return MakeErrMsg(ErrMsg, path + ": can't make unique filename"); - -  // Save the name -  path = FNBuffer; -#else -  // Okay, looks like we have to do it all by our lonesome. -  static unsigned FCounter = 0; -  // Try to initialize with unique value. -  if (FCounter == 0) FCounter = ((unsigned)getpid() & 0xFFFF) << 8; -  char* pos = strstr(FNBuffer, "XXXXXX"); -  do { -    if (++FCounter > 0xFFFFFF) { -      return MakeErrMsg(ErrMsg, -        path + ": can't make unique filename: too many files"); -    } -    sprintf(pos, "%06X", FCounter); -    path = FNBuffer; -  } while (exists()); -  // POSSIBLE SECURITY BUG: An attacker can easily guess the name and exploit -  // LLVM. -#endif -  return false; -} - -const char *Path::MapInFilePages(int FD, uint64_t FileSize) { -  int Flags = MAP_PRIVATE; -#ifdef MAP_FILE -  Flags |= MAP_FILE; -#endif -  void *BasePtr = ::mmap(0, FileSize, PROT_READ, Flags, FD, 0); -  if (BasePtr == MAP_FAILED) -    return 0; -  return (const char*)BasePtr; -} - -void Path::UnMapFilePages(const char *BasePtr, uint64_t FileSize) { -  ::munmap((void*)BasePtr, FileSize); -} - -} // end llvm namespace diff --git a/llvm/lib/System/Unix/Process.inc b/llvm/lib/System/Unix/Process.inc deleted file mode 100644 index cf6a47a31c8..00000000000 --- a/llvm/lib/System/Unix/Process.inc +++ /dev/null @@ -1,295 +0,0 @@ -//===- Unix/Process.cpp - Unix Process Implementation --------- -*- C++ -*-===// -//  -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -//  -//===----------------------------------------------------------------------===// -// -// This file provides the generic Unix implementation of the Process class. -// -//===----------------------------------------------------------------------===// - -#include "Unix.h" -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif -#ifdef HAVE_SYS_RESOURCE_H -#include <sys/resource.h> -#endif -// DragonFly BSD has deprecated <malloc.h> for <stdlib.h> instead, -//  Unix.h includes this for us already. -#if defined(HAVE_MALLOC_H) && !defined(__DragonFly__) -#include <malloc.h> -#endif -#ifdef HAVE_MALLOC_MALLOC_H -#include <malloc/malloc.h> -#endif -#ifdef HAVE_SYS_IOCTL_H -#  include <sys/ioctl.h> -#endif -#ifdef HAVE_TERMIOS_H -#  include <termios.h> -#endif - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic UNIX code that -//===          is guaranteed to work on *all* UNIX variants. -//===----------------------------------------------------------------------===// - -using namespace llvm; -using namespace sys; - -unsigned  -Process::GetPageSize()  -{ -#if defined(__CYGWIN__) -  // On Cygwin, getpagesize() returns 64k but the page size for the purposes of -  // memory protection and mmap() is 4k. -  // See http://www.cygwin.com/ml/cygwin/2009-01/threads.html#00492 -  const int page_size = 0x1000; -#elif defined(HAVE_GETPAGESIZE) -  const int page_size = ::getpagesize(); -#elif defined(HAVE_SYSCONF) -  long page_size = ::sysconf(_SC_PAGE_SIZE); -#else -#warning Cannot get the page size on this machine -#endif -  return static_cast<unsigned>(page_size); -} - -size_t Process::GetMallocUsage() { -#if defined(HAVE_MALLINFO) -  struct mallinfo mi; -  mi = ::mallinfo(); -  return mi.uordblks; -#elif defined(HAVE_MALLOC_ZONE_STATISTICS) && defined(HAVE_MALLOC_MALLOC_H) -  malloc_statistics_t Stats; -  malloc_zone_statistics(malloc_default_zone(), &Stats); -  return Stats.size_in_use;   // darwin -#elif defined(HAVE_SBRK) -  // Note this is only an approximation and more closely resembles -  // the value returned by mallinfo in the arena field. -  static char *StartOfMemory = reinterpret_cast<char*>(::sbrk(0)); -  char *EndOfMemory = (char*)sbrk(0); -  if (EndOfMemory != ((char*)-1) && StartOfMemory != ((char*)-1)) -    return EndOfMemory - StartOfMemory; -  else -    return 0; -#else -#warning Cannot get malloc info on this platform -  return 0; -#endif -} - -size_t -Process::GetTotalMemoryUsage() -{ -#if defined(HAVE_MALLINFO) -  struct mallinfo mi = ::mallinfo(); -  return mi.uordblks + mi.hblkhd; -#elif defined(HAVE_MALLOC_ZONE_STATISTICS) && defined(HAVE_MALLOC_MALLOC_H) -  malloc_statistics_t Stats; -  malloc_zone_statistics(malloc_default_zone(), &Stats); -  return Stats.size_allocated;   // darwin -#elif defined(HAVE_GETRUSAGE) && !defined(__HAIKU__) -  struct rusage usage; -  ::getrusage(RUSAGE_SELF, &usage); -  return usage.ru_maxrss; -#else -#warning Cannot get total memory size on this platform -  return 0; -#endif -} - -void -Process::GetTimeUsage(TimeValue& elapsed, TimeValue& user_time,  -                      TimeValue& sys_time) -{ -  elapsed = TimeValue::now(); -#if defined(HAVE_GETRUSAGE) -  struct rusage usage; -  ::getrusage(RUSAGE_SELF, &usage); -  user_time = TimeValue(  -    static_cast<TimeValue::SecondsType>( usage.ru_utime.tv_sec ),  -    static_cast<TimeValue::NanoSecondsType>( usage.ru_utime.tv_usec *  -      TimeValue::NANOSECONDS_PER_MICROSECOND ) ); -  sys_time = TimeValue(  -    static_cast<TimeValue::SecondsType>( usage.ru_stime.tv_sec ),  -    static_cast<TimeValue::NanoSecondsType>( usage.ru_stime.tv_usec *  -      TimeValue::NANOSECONDS_PER_MICROSECOND ) ); -#else -#warning Cannot get usage times on this platform -  user_time.seconds(0); -  user_time.microseconds(0); -  sys_time.seconds(0); -  sys_time.microseconds(0); -#endif -} - -int Process::GetCurrentUserId() { -  return getuid(); -} - -int Process::GetCurrentGroupId() { -  return getgid(); -} - -#ifdef HAVE_MACH_MACH_H -#include <mach/mach.h> -#endif - -// Some LLVM programs such as bugpoint produce core files as a normal part of -// their operation. To prevent the disk from filling up, this function -// does what's necessary to prevent their generation. -void Process::PreventCoreFiles() { -#if HAVE_SETRLIMIT -  struct rlimit rlim; -  rlim.rlim_cur = rlim.rlim_max = 0; -  setrlimit(RLIMIT_CORE, &rlim); -#endif - -#ifdef HAVE_MACH_MACH_H -  // Disable crash reporting on Mac OS X 10.0-10.4 - -  // get information about the original set of exception ports for the task -  mach_msg_type_number_t Count = 0; -  exception_mask_t OriginalMasks[EXC_TYPES_COUNT]; -  exception_port_t OriginalPorts[EXC_TYPES_COUNT]; -  exception_behavior_t OriginalBehaviors[EXC_TYPES_COUNT]; -  thread_state_flavor_t OriginalFlavors[EXC_TYPES_COUNT]; -  kern_return_t err =  -    task_get_exception_ports(mach_task_self(), EXC_MASK_ALL, OriginalMasks, -                             &Count, OriginalPorts, OriginalBehaviors, -                             OriginalFlavors); -  if (err == KERN_SUCCESS) { -    // replace each with MACH_PORT_NULL. -    for (unsigned i = 0; i != Count; ++i) -      task_set_exception_ports(mach_task_self(), OriginalMasks[i],  -                               MACH_PORT_NULL, OriginalBehaviors[i], -                               OriginalFlavors[i]); -  } - -  // Disable crash reporting on Mac OS X 10.5 -  signal(SIGABRT, _exit); -  signal(SIGILL,  _exit); -  signal(SIGFPE,  _exit); -  signal(SIGSEGV, _exit); -  signal(SIGBUS,  _exit); -#endif -} - -bool Process::StandardInIsUserInput() { -  return FileDescriptorIsDisplayed(STDIN_FILENO); -} - -bool Process::StandardOutIsDisplayed() { -  return FileDescriptorIsDisplayed(STDOUT_FILENO); -} - -bool Process::StandardErrIsDisplayed() { -  return FileDescriptorIsDisplayed(STDERR_FILENO); -} - -bool Process::FileDescriptorIsDisplayed(int fd) { -#if HAVE_ISATTY -  return isatty(fd); -#else -  // If we don't have isatty, just return false. -  return false; -#endif -} - -static unsigned getColumns(int FileID) { -  // If COLUMNS is defined in the environment, wrap to that many columns. -  if (const char *ColumnsStr = std::getenv("COLUMNS")) { -    int Columns = std::atoi(ColumnsStr); -    if (Columns > 0) -      return Columns; -  } - -  unsigned Columns = 0; - -#if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_TERMIOS_H) -  // Try to determine the width of the terminal. -  struct winsize ws; -  if (ioctl(FileID, TIOCGWINSZ, &ws) == 0) -    Columns = ws.ws_col; -#endif - -  return Columns; -} - -unsigned Process::StandardOutColumns() { -  if (!StandardOutIsDisplayed()) -    return 0; - -  return getColumns(1); -} - -unsigned Process::StandardErrColumns() { -  if (!StandardErrIsDisplayed()) -    return 0; - -  return getColumns(2); -} - -static bool terminalHasColors() { -  if (const char *term = std::getenv("TERM")) { -    // Most modern terminals support ANSI escape sequences for colors. -    // We could check terminfo, or have a list of known terms that support -    // colors, but that would be overkill. -    // The user can always ask for no colors by setting TERM to dumb, or -    // using a commandline flag. -    return strcmp(term, "dumb") != 0; -  } -  return false; -} - -bool Process::StandardOutHasColors() { -  if (!StandardOutIsDisplayed()) -    return false; -  return terminalHasColors(); -} - -bool Process::StandardErrHasColors() { -  if (!StandardErrIsDisplayed()) -    return false; -  return terminalHasColors(); -} - -bool Process::ColorNeedsFlush() { -  // No, we use ANSI escape sequences. -  return false; -} - -#define COLOR(FGBG, CODE, BOLD) "\033[0;" BOLD FGBG CODE "m" - -#define ALLCOLORS(FGBG,BOLD) {\ -    COLOR(FGBG, "0", BOLD),\ -    COLOR(FGBG, "1", BOLD),\ -    COLOR(FGBG, "2", BOLD),\ -    COLOR(FGBG, "3", BOLD),\ -    COLOR(FGBG, "4", BOLD),\ -    COLOR(FGBG, "5", BOLD),\ -    COLOR(FGBG, "6", BOLD),\ -    COLOR(FGBG, "7", BOLD)\ -  } - -static const char colorcodes[2][2][8][10] = { - { ALLCOLORS("3",""), ALLCOLORS("3","1;") }, - { ALLCOLORS("4",""), ALLCOLORS("4","1;") } -}; - -const char *Process::OutputColor(char code, bool bold, bool bg) { -  return colorcodes[bg?1:0][bold?1:0][code&7]; -} - -const char *Process::OutputBold(bool bg) { -  return "\033[1m"; -} - -const char *Process::ResetColor() { -  return "\033[0m"; -} diff --git a/llvm/lib/System/Unix/Program.inc b/llvm/lib/System/Unix/Program.inc deleted file mode 100644 index e06f80ba833..00000000000 --- a/llvm/lib/System/Unix/Program.inc +++ /dev/null @@ -1,422 +0,0 @@ -//===- llvm/System/Unix/Program.cpp -----------------------------*- C++ -*-===// -// -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the Unix specific portion of the Program class. -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic UNIX code that -//===          is guaranteed to work on *all* UNIX variants. -//===----------------------------------------------------------------------===// - -#include <llvm/Config/config.h> -#include "Unix.h" -#if HAVE_SYS_STAT_H -#include <sys/stat.h> -#endif -#if HAVE_SYS_RESOURCE_H -#include <sys/resource.h> -#endif -#if HAVE_SIGNAL_H -#include <signal.h> -#endif -#if HAVE_FCNTL_H -#include <fcntl.h> -#endif -#ifdef HAVE_POSIX_SPAWN -#include <spawn.h> -#if !defined(__APPLE__) -  extern char **environ; -#else -#include <crt_externs.h> // _NSGetEnviron -#endif -#endif - -namespace llvm { -using namespace sys; - -Program::Program() : Data_(0) {} - -Program::~Program() {} - -unsigned Program::GetPid() const { -  uint64_t pid = reinterpret_cast<uint64_t>(Data_); -  return static_cast<unsigned>(pid); -} - -// This function just uses the PATH environment variable to find the program. -Path -Program::FindProgramByName(const std::string& progName) { - -  // Check some degenerate cases -  if (progName.length() == 0) // no program -    return Path(); -  Path temp; -  if (!temp.set(progName)) // invalid name -    return Path(); -  // Use the given path verbatim if it contains any slashes; this matches -  // the behavior of sh(1) and friends. -  if (progName.find('/') != std::string::npos) -    return temp; - -  // At this point, the file name is valid and does not contain slashes. Search -  // for it through the directories specified in the PATH environment variable. - -  // Get the path. If its empty, we can't do anything to find it. -  const char *PathStr = getenv("PATH"); -  if (PathStr == 0) -    return Path(); - -  // Now we have a colon separated list of directories to search; try them. -  size_t PathLen = strlen(PathStr); -  while (PathLen) { -    // Find the first colon... -    const char *Colon = std::find(PathStr, PathStr+PathLen, ':'); - -    // Check to see if this first directory contains the executable... -    Path FilePath; -    if (FilePath.set(std::string(PathStr,Colon))) { -      FilePath.appendComponent(progName); -      if (FilePath.canExecute()) -        return FilePath;                    // Found the executable! -    } - -    // Nope it wasn't in this directory, check the next path in the list! -    PathLen -= Colon-PathStr; -    PathStr = Colon; - -    // Advance past duplicate colons -    while (*PathStr == ':') { -      PathStr++; -      PathLen--; -    } -  } -  return Path(); -} - -static bool RedirectIO(const Path *Path, int FD, std::string* ErrMsg) { -  if (Path == 0) // Noop -    return false; -  const char *File; -  if (Path->isEmpty()) -    // Redirect empty paths to /dev/null -    File = "/dev/null"; -  else -    File = Path->c_str(); - -  // Open the file -  int InFD = open(File, FD == 0 ? O_RDONLY : O_WRONLY|O_CREAT, 0666); -  if (InFD == -1) { -    MakeErrMsg(ErrMsg, "Cannot open file '" + std::string(File) + "' for " -              + (FD == 0 ? "input" : "output")); -    return true; -  } - -  // Install it as the requested FD -  if (dup2(InFD, FD) == -1) { -    MakeErrMsg(ErrMsg, "Cannot dup2"); -    close(InFD); -    return true; -  } -  close(InFD);      // Close the original FD -  return false; -} - -#ifdef HAVE_POSIX_SPAWN -static bool RedirectIO_PS(const Path *Path, int FD, std::string *ErrMsg, -                          posix_spawn_file_actions_t &FileActions) { -  if (Path == 0) // Noop -    return false; -  const char *File; -  if (Path->isEmpty()) -    // Redirect empty paths to /dev/null -    File = "/dev/null"; -  else -    File = Path->c_str(); - -  if (int Err = posix_spawn_file_actions_addopen(&FileActions, FD, -                            File, FD == 0 ? O_RDONLY : O_WRONLY|O_CREAT, 0666)) -    return MakeErrMsg(ErrMsg, "Cannot dup2", Err); -  return false; -} -#endif - -static void TimeOutHandler(int Sig) { -} - -static void SetMemoryLimits (unsigned size) -{ -#if HAVE_SYS_RESOURCE_H && HAVE_GETRLIMIT && HAVE_SETRLIMIT -  struct rlimit r; -  __typeof__ (r.rlim_cur) limit = (__typeof__ (r.rlim_cur)) (size) * 1048576; - -  // Heap size -  getrlimit (RLIMIT_DATA, &r); -  r.rlim_cur = limit; -  setrlimit (RLIMIT_DATA, &r); -#ifdef RLIMIT_RSS -  // Resident set size. -  getrlimit (RLIMIT_RSS, &r); -  r.rlim_cur = limit; -  setrlimit (RLIMIT_RSS, &r); -#endif -#ifdef RLIMIT_AS  // e.g. NetBSD doesn't have it. -  // Virtual memory. -  getrlimit (RLIMIT_AS, &r); -  r.rlim_cur = limit; -  setrlimit (RLIMIT_AS, &r); -#endif -#endif -} - -bool -Program::Execute(const Path &path, const char **args, const char **envp, -                 const Path **redirects, unsigned memoryLimit, -                  std::string *ErrMsg) { -  // If this OS has posix_spawn and there is no memory limit being implied, use -  // posix_spawn.  It is more efficient than fork/exec. -#ifdef HAVE_POSIX_SPAWN -  if (memoryLimit == 0) { -    posix_spawn_file_actions_t FileActions; -    posix_spawn_file_actions_init(&FileActions); - -    if (redirects) { -      // Redirect stdin/stdout. -      if (RedirectIO_PS(redirects[0], 0, ErrMsg, FileActions) || -          RedirectIO_PS(redirects[1], 1, ErrMsg, FileActions)) -        return false; -      if (redirects[1] == 0 || redirects[2] == 0 || -          *redirects[1] != *redirects[2]) { -        // Just redirect stderr -        if (RedirectIO_PS(redirects[2], 2, ErrMsg, FileActions)) return false; -      } else { -        // If stdout and stderr should go to the same place, redirect stderr -        // to the FD already open for stdout. -        if (int Err = posix_spawn_file_actions_adddup2(&FileActions, 1, 2)) -          return !MakeErrMsg(ErrMsg, "Can't redirect stderr to stdout", Err); -      } -    } - -    if (!envp) -#if !defined(__APPLE__) -      envp = const_cast<const char **>(environ); -#else -      // environ is missing in dylibs. -      envp = const_cast<const char **>(*_NSGetEnviron()); -#endif - -    // Explicitly initialized to prevent what appears to be a valgrind false -    // positive. -    pid_t PID = 0; -    int Err = posix_spawn(&PID, path.c_str(), &FileActions, /*attrp*/0, -                          const_cast<char **>(args), const_cast<char **>(envp)); - -    posix_spawn_file_actions_destroy(&FileActions); - -    if (Err) -     return !MakeErrMsg(ErrMsg, "posix_spawn failed", Err); - -    Data_ = reinterpret_cast<void*>(PID); -    return true; -  } -#endif - -  // Create a child process. -  int child = fork(); -  switch (child) { -    // An error occured:  Return to the caller. -    case -1: -      MakeErrMsg(ErrMsg, "Couldn't fork"); -      return false; - -    // Child process: Execute the program. -    case 0: { -      // Redirect file descriptors... -      if (redirects) { -        // Redirect stdin -        if (RedirectIO(redirects[0], 0, ErrMsg)) { return false; } -        // Redirect stdout -        if (RedirectIO(redirects[1], 1, ErrMsg)) { return false; } -        if (redirects[1] && redirects[2] && -            *(redirects[1]) == *(redirects[2])) { -          // If stdout and stderr should go to the same place, redirect stderr -          // to the FD already open for stdout. -          if (-1 == dup2(1,2)) { -            MakeErrMsg(ErrMsg, "Can't redirect stderr to stdout"); -            return false; -          } -        } else { -          // Just redirect stderr -          if (RedirectIO(redirects[2], 2, ErrMsg)) { return false; } -        } -      } - -      // Set memory limits -      if (memoryLimit!=0) { -        SetMemoryLimits(memoryLimit); -      } - -      // Execute! -      if (envp != 0) -        execve(path.c_str(), -               const_cast<char **>(args), -               const_cast<char **>(envp)); -      else -        execv(path.c_str(), -              const_cast<char **>(args)); -      // If the execve() failed, we should exit. Follow Unix protocol and -      // return 127 if the executable was not found, and 126 otherwise. -      // Use _exit rather than exit so that atexit functions and static -      // object destructors cloned from the parent process aren't -      // redundantly run, and so that any data buffered in stdio buffers -      // cloned from the parent aren't redundantly written out. -      _exit(errno == ENOENT ? 127 : 126); -    } - -    // Parent process: Break out of the switch to do our processing. -    default: -      break; -  } - -  Data_ = reinterpret_cast<void*>(child); - -  return true; -} - -int -Program::Wait(const sys::Path &path, -              unsigned secondsToWait, -              std::string* ErrMsg) -{ -#ifdef HAVE_SYS_WAIT_H -  struct sigaction Act, Old; - -  if (Data_ == 0) { -    MakeErrMsg(ErrMsg, "Process not started!"); -    return -1; -  } - -  // Install a timeout handler.  The handler itself does nothing, but the simple -  // fact of having a handler at all causes the wait below to return with EINTR, -  // unlike if we used SIG_IGN. -  if (secondsToWait) { -    memset(&Act, 0, sizeof(Act)); -    Act.sa_handler = TimeOutHandler; -    sigemptyset(&Act.sa_mask); -    sigaction(SIGALRM, &Act, &Old); -    alarm(secondsToWait); -  } - -  // Parent process: Wait for the child process to terminate. -  int status; -  uint64_t pid = reinterpret_cast<uint64_t>(Data_); -  pid_t child = static_cast<pid_t>(pid); -  while (waitpid(pid, &status, 0) != child) -    if (secondsToWait && errno == EINTR) { -      // Kill the child. -      kill(child, SIGKILL); - -      // Turn off the alarm and restore the signal handler -      alarm(0); -      sigaction(SIGALRM, &Old, 0); - -      // Wait for child to die -      if (wait(&status) != child) -        MakeErrMsg(ErrMsg, "Child timed out but wouldn't die"); -      else -        MakeErrMsg(ErrMsg, "Child timed out", 0); - -      return -1;   // Timeout detected -    } else if (errno != EINTR) { -      MakeErrMsg(ErrMsg, "Error waiting for child process"); -      return -1; -    } - -  // We exited normally without timeout, so turn off the timer. -  if (secondsToWait) { -    alarm(0); -    sigaction(SIGALRM, &Old, 0); -  } - -  // Return the proper exit status. Detect error conditions -  // so we can return -1 for them and set ErrMsg informatively. -  int result = 0; -  if (WIFEXITED(status)) { -    result = WEXITSTATUS(status); -#ifdef HAVE_POSIX_SPAWN -    // The posix_spawn child process returns 127 on any kind of error. -    // Following the POSIX convention for command-line tools (which posix_spawn -    // itself apparently does not), check to see if the failure was due to some -    // reason other than the file not existing, and return 126 in this case. -    if (result == 127 && path.exists()) -      result = 126; -#endif -    if (result == 127) { -      if (ErrMsg) -        *ErrMsg = llvm::sys::StrError(ENOENT); -      return -1; -    } -    if (result == 126) { -      if (ErrMsg) -        *ErrMsg = "Program could not be executed"; -      return -1; -    } -  } else if (WIFSIGNALED(status)) { -    if (ErrMsg) { -      *ErrMsg = strsignal(WTERMSIG(status)); -#ifdef WCOREDUMP -      if (WCOREDUMP(status)) -        *ErrMsg += " (core dumped)"; -#endif -    } -    return -1; -  } -  return result; -#else -  if (ErrMsg) -    *ErrMsg = "Program::Wait is not implemented on this platform yet!"; -  return -1; -#endif -} - -bool -Program::Kill(std::string* ErrMsg) { -  if (Data_ == 0) { -    MakeErrMsg(ErrMsg, "Process not started!"); -    return true; -  } - -  uint64_t pid64 = reinterpret_cast<uint64_t>(Data_); -  pid_t pid = static_cast<pid_t>(pid64); - -  if (kill(pid, SIGKILL) != 0) { -    MakeErrMsg(ErrMsg, "The process couldn't be killed!"); -    return true; -  } - -  return false; -} - -bool Program::ChangeStdinToBinary(){ -  // Do nothing, as Unix doesn't differentiate between text and binary. -  return false; -} - -bool Program::ChangeStdoutToBinary(){ -  // Do nothing, as Unix doesn't differentiate between text and binary. -  return false; -} - -bool Program::ChangeStderrToBinary(){ -  // Do nothing, as Unix doesn't differentiate between text and binary. -  return false; -} - -} diff --git a/llvm/lib/System/Unix/README.txt b/llvm/lib/System/Unix/README.txt deleted file mode 100644 index b3bace483e5..00000000000 --- a/llvm/lib/System/Unix/README.txt +++ /dev/null @@ -1,16 +0,0 @@ -llvm/lib/System/Unix README -=========================== - -This directory provides implementations of the lib/System classes that -are common to two or more variants of UNIX. For example, the directory  -structure underneath this directory could look like this: - -Unix           - only code that is truly generic to all UNIX platforms -  Posix        - code that is specific to Posix variants of UNIX -  SUS          - code that is specific to the Single Unix Specification  -  SysV         - code that is specific to System V variants of UNIX - -As a rule, only those directories actually needing to be created should be -created. Also, further subdirectories could be created to reflect versions of -the various standards. For example, under SUS there could be v1, v2, and v3 -subdirectories to reflect the three major versions of SUS. diff --git a/llvm/lib/System/Unix/RWMutex.inc b/llvm/lib/System/Unix/RWMutex.inc deleted file mode 100644 index e83d41ef4cf..00000000000 --- a/llvm/lib/System/Unix/RWMutex.inc +++ /dev/null @@ -1,43 +0,0 @@ -//= llvm/System/Unix/RWMutex.inc - Unix Reader/Writer Mutual Exclusion Lock  =// -//  -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -//  -//===----------------------------------------------------------------------===// -// -// This file implements the Unix specific (non-pthread) RWMutex class. -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic UNIX code that -//===          is guaranteed to work on *all* UNIX variants. -//===----------------------------------------------------------------------===// - -namespace llvm { - -using namespace sys; - -RWMutexImpl::RWMutexImpl() { } - -RWMutexImpl::~RWMutexImpl() { } - -bool RWMutexImpl::reader_acquire() { -  return true; -} - -bool RWMutexImpl::reader_release() { -  return true; -} - -bool RWMutexImpl::writer_acquire() { -  return true; -} - -bool RWMutexImpl::writer_release() { -  return true; -} - -} diff --git a/llvm/lib/System/Unix/Signals.inc b/llvm/lib/System/Unix/Signals.inc deleted file mode 100644 index 997d4781d86..00000000000 --- a/llvm/lib/System/Unix/Signals.inc +++ /dev/null @@ -1,303 +0,0 @@ -//===- Signals.cpp - Generic Unix Signals Implementation -----*- C++ -*-===// -//  -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -//  -//===----------------------------------------------------------------------===// -// -// This file defines some helpful functions for dealing with the possibility of -// Unix signals occuring while your program is running. -// -//===----------------------------------------------------------------------===// - -#include "Unix.h" -#include "llvm/ADT/STLExtras.h" -#include "llvm/System/Mutex.h" -#include <vector> -#include <algorithm> -#if HAVE_EXECINFO_H -# include <execinfo.h>         // For backtrace(). -#endif -#if HAVE_SIGNAL_H -#include <signal.h> -#endif -#if HAVE_SYS_STAT_H -#include <sys/stat.h> -#endif -#if HAVE_DLFCN_H && __GNUG__ -#include <dlfcn.h> -#include <cxxabi.h>  -#endif -using namespace llvm; - -static RETSIGTYPE SignalHandler(int Sig);  // defined below. - -static SmartMutex<true> SignalsMutex; - -/// InterruptFunction - The function to call if ctrl-c is pressed. -static void (*InterruptFunction)() = 0; - -static std::vector<sys::Path> FilesToRemove; -static std::vector<std::pair<void(*)(void*), void*> > CallBacksToRun; - -// IntSigs - Signals that may interrupt the program at any time. -static const int IntSigs[] = { -  SIGHUP, SIGINT, SIGQUIT, SIGPIPE, SIGTERM, SIGUSR1, SIGUSR2 -}; -static const int *const IntSigsEnd = -  IntSigs + sizeof(IntSigs) / sizeof(IntSigs[0]); - -// KillSigs - Signals that are synchronous with the program that will cause it -// to die. -static const int KillSigs[] = { -  SIGILL, SIGTRAP, SIGABRT, SIGFPE, SIGBUS, SIGSEGV -#ifdef SIGSYS -  , SIGSYS -#endif -#ifdef SIGXCPU -  , SIGXCPU -#endif -#ifdef SIGXFSZ -  , SIGXFSZ -#endif -#ifdef SIGEMT -  , SIGEMT -#endif -}; -static const int *const KillSigsEnd = -  KillSigs + sizeof(KillSigs) / sizeof(KillSigs[0]); - -static unsigned NumRegisteredSignals = 0; -static struct { -  struct sigaction SA; -  int SigNo; -} RegisteredSignalInfo[(sizeof(IntSigs)+sizeof(KillSigs))/sizeof(KillSigs[0])]; - - -static void RegisterHandler(int Signal) { -  assert(NumRegisteredSignals < -         sizeof(RegisteredSignalInfo)/sizeof(RegisteredSignalInfo[0]) && -         "Out of space for signal handlers!"); - -  struct sigaction NewHandler; -   -  NewHandler.sa_handler = SignalHandler; -  NewHandler.sa_flags = SA_NODEFER|SA_RESETHAND; -  sigemptyset(&NewHandler.sa_mask);  -   -  // Install the new handler, save the old one in RegisteredSignalInfo. -  sigaction(Signal, &NewHandler, -            &RegisteredSignalInfo[NumRegisteredSignals].SA); -  RegisteredSignalInfo[NumRegisteredSignals].SigNo = Signal; -  ++NumRegisteredSignals; -} - -static void RegisterHandlers() { -  // If the handlers are already registered, we're done. -  if (NumRegisteredSignals != 0) return; - -  std::for_each(IntSigs, IntSigsEnd, RegisterHandler); -  std::for_each(KillSigs, KillSigsEnd, RegisterHandler); -} - -static void UnregisterHandlers() { -  // Restore all of the signal handlers to how they were before we showed up. -  for (unsigned i = 0, e = NumRegisteredSignals; i != e; ++i) -    sigaction(RegisteredSignalInfo[i].SigNo, -              &RegisteredSignalInfo[i].SA, 0); -  NumRegisteredSignals = 0; -} - - -/// RemoveFilesToRemove - Process the FilesToRemove list. This function -/// should be called with the SignalsMutex lock held. -static void RemoveFilesToRemove() { -  while (!FilesToRemove.empty()) { -    FilesToRemove.back().eraseFromDisk(true); -    FilesToRemove.pop_back(); -  } -} - -// SignalHandler - The signal handler that runs. -static RETSIGTYPE SignalHandler(int Sig) { -  // Restore the signal behavior to default, so that the program actually -  // crashes when we return and the signal reissues.  This also ensures that if -  // we crash in our signal handler that the program will terminate immediately -  // instead of recursing in the signal handler. -  UnregisterHandlers(); - -  // Unmask all potentially blocked kill signals. -  sigset_t SigMask; -  sigfillset(&SigMask); -  sigprocmask(SIG_UNBLOCK, &SigMask, 0); - -  SignalsMutex.acquire(); -  RemoveFilesToRemove(); - -  if (std::find(IntSigs, IntSigsEnd, Sig) != IntSigsEnd) { -    if (InterruptFunction) { -      void (*IF)() = InterruptFunction; -      SignalsMutex.release(); -      InterruptFunction = 0; -      IF();        // run the interrupt function. -      return; -    } -     -    SignalsMutex.release(); -    raise(Sig);   // Execute the default handler. -    return; -  } - -  SignalsMutex.release(); - -  // Otherwise if it is a fault (like SEGV) run any handler. -  for (unsigned i = 0, e = CallBacksToRun.size(); i != e; ++i) -    CallBacksToRun[i].first(CallBacksToRun[i].second); -} - -void llvm::sys::RunInterruptHandlers() { -  SignalsMutex.acquire(); -  RemoveFilesToRemove(); -  SignalsMutex.release(); -} - -void llvm::sys::SetInterruptFunction(void (*IF)()) { -  SignalsMutex.acquire(); -  InterruptFunction = IF; -  SignalsMutex.release(); -  RegisterHandlers(); -} - -// RemoveFileOnSignal - The public API -bool llvm::sys::RemoveFileOnSignal(const sys::Path &Filename, -                                   std::string* ErrMsg) { -  SignalsMutex.acquire(); -  FilesToRemove.push_back(Filename); - -  SignalsMutex.release(); - -  RegisterHandlers(); -  return false; -} - -// DontRemoveFileOnSignal - The public API -void llvm::sys::DontRemoveFileOnSignal(const sys::Path &Filename) { -  SignalsMutex.acquire(); -  std::vector<sys::Path>::reverse_iterator I = -    std::find(FilesToRemove.rbegin(), FilesToRemove.rend(), Filename); -  if (I != FilesToRemove.rend()) -    FilesToRemove.erase(I.base()-1); -  SignalsMutex.release(); -} - -/// AddSignalHandler - Add a function to be called when a signal is delivered -/// to the process.  The handler can have a cookie passed to it to identify -/// what instance of the handler it is. -void llvm::sys::AddSignalHandler(void (*FnPtr)(void *), void *Cookie) { -  CallBacksToRun.push_back(std::make_pair(FnPtr, Cookie)); -  RegisterHandlers(); -} - - -// PrintStackTrace - In the case of a program crash or fault, print out a stack -// trace so that the user has an indication of why and where we died. -// -// On glibc systems we have the 'backtrace' function, which works nicely, but -// doesn't demangle symbols.   -static void PrintStackTrace(void *) { -#ifdef HAVE_BACKTRACE -  static void* StackTrace[256]; -  // Use backtrace() to output a backtrace on Linux systems with glibc. -  int depth = backtrace(StackTrace, -                        static_cast<int>(array_lengthof(StackTrace))); -#if HAVE_DLFCN_H && __GNUG__ -  int width = 0; -  for (int i = 0; i < depth; ++i) { -    Dl_info dlinfo; -    dladdr(StackTrace[i], &dlinfo); -    const char* name = strrchr(dlinfo.dli_fname, '/'); - -    int nwidth; -    if (name == NULL) nwidth = strlen(dlinfo.dli_fname); -    else              nwidth = strlen(name) - 1; - -    if (nwidth > width) width = nwidth; -  } - -  for (int i = 0; i < depth; ++i) { -    Dl_info dlinfo; -    dladdr(StackTrace[i], &dlinfo); - -    fprintf(stderr, "%-2d", i); - -    const char* name = strrchr(dlinfo.dli_fname, '/'); -    if (name == NULL) fprintf(stderr, " %-*s", width, dlinfo.dli_fname); -    else              fprintf(stderr, " %-*s", width, name+1); - -    fprintf(stderr, " %#0*lx", -            (int)(sizeof(void*) * 2) + 2, (unsigned long)StackTrace[i]); - -    if (dlinfo.dli_sname != NULL) { -      int res; -      fputc(' ', stderr); -      char* d = abi::__cxa_demangle(dlinfo.dli_sname, NULL, NULL, &res); -      if (d == NULL) fputs(dlinfo.dli_sname, stderr); -      else           fputs(d, stderr); -      free(d); - -      fprintf(stderr, " + %tu",(char*)StackTrace[i]-(char*)dlinfo.dli_saddr); -    } -    fputc('\n', stderr); -  } -#else -  backtrace_symbols_fd(StackTrace, depth, STDERR_FILENO); -#endif -#endif -} - -/// PrintStackTraceOnErrorSignal - When an error signal (such as SIBABRT or -/// SIGSEGV) is delivered to the process, print a stack trace and then exit. -void llvm::sys::PrintStackTraceOnErrorSignal() { -  AddSignalHandler(PrintStackTrace, 0); -} - - -/***/ - -// On Darwin, raise sends a signal to the main thread instead of the current -// thread. This has the unfortunate effect that assert() and abort() will end up -// bypassing our crash recovery attempts. We work around this for anything in -// the same linkage unit by just defining our own versions of the assert handler -// and abort. - -#ifdef __APPLE__ - -int raise(int sig) { -  return pthread_kill(pthread_self(), sig); -} - -void __assert_rtn(const char *func, -                  const char *file, -                  int line, -                  const char *expr) { -  if (func) -    fprintf(stderr, "Assertion failed: (%s), function %s, file %s, line %d.\n", -            expr, func, file, line); -  else -    fprintf(stderr, "Assertion failed: (%s), file %s, line %d.\n", -            expr, file, line); -  abort(); -} - -#include <signal.h> -#include <pthread.h> - -void abort() { -  raise(SIGABRT); -  usleep(1000); -  __builtin_trap(); -} - -#endif diff --git a/llvm/lib/System/Unix/ThreadLocal.inc b/llvm/lib/System/Unix/ThreadLocal.inc deleted file mode 100644 index 6769520a6fb..00000000000 --- a/llvm/lib/System/Unix/ThreadLocal.inc +++ /dev/null @@ -1,26 +0,0 @@ -//=== llvm/System/Unix/ThreadLocal.inc - Unix Thread Local Data -*- C++ -*-===// -//  -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -//  -//===----------------------------------------------------------------------===// -// -// This file implements the Unix specific (non-pthread) ThreadLocal class. -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic UNIX code that -//===          is guaranteed to work on *all* UNIX variants. -//===----------------------------------------------------------------------===// - -namespace llvm { -using namespace sys; -ThreadLocalImpl::ThreadLocalImpl() { } -ThreadLocalImpl::~ThreadLocalImpl() { } -void ThreadLocalImpl::setInstance(const void* d) { data = const_cast<void*>(d);} -const void* ThreadLocalImpl::getInstance() { return data; } -void ThreadLocalImpl::removeInstance() { setInstance(0); } -} diff --git a/llvm/lib/System/Unix/TimeValue.inc b/llvm/lib/System/Unix/TimeValue.inc deleted file mode 100644 index d8cc8f55eec..00000000000 --- a/llvm/lib/System/Unix/TimeValue.inc +++ /dev/null @@ -1,56 +0,0 @@ -//===- Unix/TimeValue.cpp - Unix TimeValue Implementation -------*- C++ -*-===// -//  -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -//  -//===----------------------------------------------------------------------===// -// -// This file implements the Unix specific portion of the TimeValue class. -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic UNIX code that -//===          is guaranteed to work on *all* UNIX variants. -//===----------------------------------------------------------------------===// - -#include "Unix.h" - -namespace llvm { -  using namespace sys; - -std::string TimeValue::str() const { -  char buffer[32]; - -  time_t ourTime = time_t(this->toEpochTime()); -#ifdef __hpux -// note that the following line needs -D_REENTRANT on HP-UX to be picked up  -  asctime_r(localtime(&ourTime), buffer); -#else -  ::asctime_r(::localtime(&ourTime), buffer); -#endif - -  std::string result(buffer); -  return result.substr(0,24); -} - -TimeValue TimeValue::now() { -  struct timeval the_time; -  timerclear(&the_time); -  if (0 != ::gettimeofday(&the_time,0)) { -    // This is *really* unlikely to occur because the only gettimeofday -    // errors concern the timezone parameter which we're passing in as 0. -    // In the unlikely case it does happen, just return MinTime, no error -    // message needed.  -    return MinTime; -  } - -  return TimeValue( -    static_cast<TimeValue::SecondsType>( the_time.tv_sec + PosixZeroTime.seconds_ ),  -    static_cast<TimeValue::NanoSecondsType>( the_time.tv_usec *  -      NANOSECONDS_PER_MICROSECOND ) ); -} - -} diff --git a/llvm/lib/System/Unix/Unix.h b/llvm/lib/System/Unix/Unix.h deleted file mode 100644 index c15866f3d90..00000000000 --- a/llvm/lib/System/Unix/Unix.h +++ /dev/null @@ -1,87 +0,0 @@ -//===- llvm/System/Unix/Unix.h - Common Unix Include File -------*- C++ -*-===// -// -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines things specific to Unix implementations. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SYSTEM_UNIX_UNIX_H -#define LLVM_SYSTEM_UNIX_UNIX_H - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic UNIX code that -//===          is guaranteed to work on all UNIX variants. -//===----------------------------------------------------------------------===// - -#include "llvm/Config/config.h"     // Get autoconf configuration settings -#include "llvm/System/Errno.h" -#include <cstdlib> -#include <cstdio> -#include <cstring> -#include <cerrno> -#include <string> -#include <algorithm> - -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif - -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif - -#ifdef HAVE_SYS_PARAM_H -#include <sys/param.h> -#endif - -#ifdef HAVE_ASSERT_H -#include <assert.h> -#endif - -#ifdef TIME_WITH_SYS_TIME -# include <sys/time.h> -# include <time.h> -#else -# ifdef HAVE_SYS_TIME_H -#  include <sys/time.h> -# else -#  include <time.h> -# endif -#endif - -#ifdef HAVE_SYS_WAIT_H -# include <sys/wait.h> -#endif - -#ifndef WEXITSTATUS -# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) -#endif - -#ifndef WIFEXITED -# define WIFEXITED(stat_val) (((stat_val) & 255) == 0) -#endif - -/// This function builds an error message into \p ErrMsg using the \p prefix -/// string and the Unix error number given by \p errnum. If errnum is -1, the -/// default then the value of errno is used. -/// @brief Make an error message -/// -/// If the error number can be converted to a string, it will be -/// separated from prefix by ": ". -static inline bool MakeErrMsg( -  std::string* ErrMsg, const std::string& prefix, int errnum = -1) { -  if (!ErrMsg) -    return true; -  if (errnum == -1) -    errnum = errno; -  *ErrMsg = prefix + ": " + llvm::sys::StrError(errnum); -  return true; -} - -#endif diff --git a/llvm/lib/System/Unix/system_error.inc b/llvm/lib/System/Unix/system_error.inc deleted file mode 100644 index a382214877f..00000000000 --- a/llvm/lib/System/Unix/system_error.inc +++ /dev/null @@ -1,34 +0,0 @@ -//===- llvm/System/Unix/system_error.inc - Unix error_code ------*- C++ -*-===// -// -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file provides the Unix specific implementation of the error_code -// and error_condition classes. -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic UNIX code that -//===          is guaranteed to work on *all* UNIX variants. -//===----------------------------------------------------------------------===// - -using namespace llvm; - -std::string -_system_error_category::message(int ev) const { -  return _do_message::message(ev); -} - -error_condition -_system_error_category::default_error_condition(int ev) const { -#ifdef ELAST -  if (ev > ELAST) -    return error_condition(ev, system_category()); -#endif  // ELAST -  return error_condition(ev, generic_category()); -}  | 

