153ca1f3190680f3e86aebe0f72f7918d63f71e0dCharles Davis//===- llvm/Support/Unix/Unix.h - Common Unix Include File -------*- C++ -*-===//
2f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman//
3b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer//                     The LLVM Compiler Infrastructure
4b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman//
8b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer//===----------------------------------------------------------------------===//
9b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer//
10b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer// This file defines things specific to Unix implementations.
11b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer//
12b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer//===----------------------------------------------------------------------===//
13b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer
147c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#ifndef LLVM_SYSTEM_UNIX_UNIX_H
157c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#define LLVM_SYSTEM_UNIX_UNIX_H
167c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer
17b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer//===----------------------------------------------------------------------===//
18b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer//=== WARNING: Implementation here must contain only generic UNIX code that
19b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer//===          is guaranteed to work on all UNIX variants.
20b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer//===----------------------------------------------------------------------===//
21b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer
22551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Config/config.h"     // Get autoconf configuration settings
237a9ff3d36c5bbf1f30795a5113978876e137031aMichael J. Spencer#include "llvm/Support/Errno.h"
24c3de9524268cfcd2d04fbf464d3b1dafc20f3e7cReid Spencer#include <cstdlib>
25c3de9524268cfcd2d04fbf464d3b1dafc20f3e7cReid Spencer#include <cstdio>
26c3de9524268cfcd2d04fbf464d3b1dafc20f3e7cReid Spencer#include <cstring>
27c3de9524268cfcd2d04fbf464d3b1dafc20f3e7cReid Spencer#include <cerrno>
287c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#include <string>
297c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#include <algorithm>
307c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer
317c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#ifdef HAVE_UNISTD_H
327c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#include <unistd.h>
337c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#endif
347c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer
357c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#ifdef HAVE_SYS_TYPES_H
36b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer#include <sys/types.h>
377c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#endif
387c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer
397c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#ifdef HAVE_SYS_PARAM_H
40b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer#include <sys/param.h>
41f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman#endif
427c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer
437c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#ifdef HAVE_ASSERT_H
44b60bf6171d031ef38948b40ef0f8de5233f9361cReid Spencer#include <assert.h>
457c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#endif
467c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer
478dab5047999c57cdcf24ff04e20a1f2c9a100d8fMichael J. Spencer#ifdef HAVE_SYS_TIME_H
487c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer# include <sys/time.h>
497c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#endif
508dab5047999c57cdcf24ff04e20a1f2c9a100d8fMichael J. Spencer#include <time.h>
517c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer
527c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#ifdef HAVE_SYS_WAIT_H
537c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer# include <sys/wait.h>
547c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#endif
557c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer
567c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#ifndef WEXITSTATUS
577c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
587c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#endif
597c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer
607c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#ifndef WIFEXITED
617c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
627c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#endif
63b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer
644ce5dc63778f36f61b510456783f15a224406e68Reid Spencer/// This function builds an error message into \p ErrMsg using the \p prefix
654ce5dc63778f36f61b510456783f15a224406e68Reid Spencer/// string and the Unix error number given by \p errnum. If errnum is -1, the
664ce5dc63778f36f61b510456783f15a224406e68Reid Spencer/// default then the value of errno is used.
674ce5dc63778f36f61b510456783f15a224406e68Reid Spencer/// @brief Make an error message
68a7f2a9e69fc53920640c4707cc8c4045d9ea7db9Daniel Dunbar///
69a7f2a9e69fc53920640c4707cc8c4045d9ea7db9Daniel Dunbar/// If the error number can be converted to a string, it will be
70a7f2a9e69fc53920640c4707cc8c4045d9ea7db9Daniel Dunbar/// separated from prefix by ": ".
71844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanstatic inline bool MakeErrMsg(
724ce5dc63778f36f61b510456783f15a224406e68Reid Spencer  std::string* ErrMsg, const std::string& prefix, int errnum = -1) {
734ce5dc63778f36f61b510456783f15a224406e68Reid Spencer  if (!ErrMsg)
745a060775da43ec2ef37e839e93a0805d543708a9Reid Spencer    return true;
754ce5dc63778f36f61b510456783f15a224406e68Reid Spencer  if (errnum == -1)
764ce5dc63778f36f61b510456783f15a224406e68Reid Spencer    errnum = errno;
77ed1c0ffe0b2287deaee7cba7506c93aa34c6d4b7Jeffrey Yasskin  *ErrMsg = prefix + ": " + llvm::sys::StrError(errnum);
785a060775da43ec2ef37e839e93a0805d543708a9Reid Spencer  return true;
794ce5dc63778f36f61b510456783f15a224406e68Reid Spencer}
804ce5dc63778f36f61b510456783f15a224406e68Reid Spencer
817c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#endif
82