1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- System.inc ---------------------------------------------------------===//
2affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
3affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//                     The MCLinker Project
4affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
5affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// This file is distributed under the University of Illinois Open Source
6affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// License. See LICENSE.TXT for details.
7affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
8affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===//
9cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <cstring>
10affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <sys/types.h>
11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <sys/stat.h>
12f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <sys/utsname.h>
13f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <ctype.h>
14f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <cstdlib>
15affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <fcntl.h>
16f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <unistd.h>
17f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
18f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <llvm/ADT/StringRef.h>
19affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
20affc150dc44fab1911775a49636d0ce85333b634Zonr Changnamespace mcld{
21affc150dc44fab1911775a49636d0ce85333b634Zonr Changnamespace sys{
22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
23affc150dc44fab1911775a49636d0ce85333b634Zonr Changchar *strerror(int errnum)
24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
25cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return std::strerror(errnum);
26affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}
27affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
28f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesstatic std::string getOSVersion()
29f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{
30f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  struct utsname info;
31f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
32f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  if (uname(&info))
33f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    return "";
34f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
35f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  return info.release;
36f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines}
37f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
38f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesstd::string getDefaultTargetTriple()
39f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{
40f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  llvm::StringRef TargetTripleString(MCLD_DEFAULT_TARGET_TRIPLE);
41f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  std::pair<llvm::StringRef, llvm::StringRef> ArchSplit = TargetTripleString.split('-');
42f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
43f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  // Normalize the arch, since the target triple may not actually match the target.
44f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  std::string Arch = ArchSplit.first;
45f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
46f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  std::string Triple(Arch);
47f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  Triple += '-';
48f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  Triple += ArchSplit.second;
49f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
50f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  // Force i<N>86 to i386.
51f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  if (Triple[0] == 'i' && isdigit(Triple[1]) &&
52f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines      Triple[2] == '8' && Triple[3] == '6')
53f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    Triple[1] = '3';
54f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
55f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  // On darwin, we want to update the version to match that of the
56f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  // target.
57f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  std::string::size_type DarwinDashIdx = Triple.find("-darwin");
58f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  if (DarwinDashIdx != std::string::npos) {
59f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    Triple.resize(DarwinDashIdx + strlen("-darwin"));
60f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    Triple += getOSVersion();
61f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  }
62f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
63f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  return Triple;
64f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines}
65f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
66f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesint GetPageSize()
67f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{
68f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  return getpagesize();
69f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines}
70f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
71f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines/// random - generate a random number.
72f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hineslong GetRandomNum()
73f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{
74f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  return ::random();
75f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines}
76f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
77f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines/// srandom - set the initial seed value for future calls to random().
78f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesvoid SetRandomSeed(unsigned pSeed)
79f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{
80f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  ::srandom(pSeed);
81f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines}
82f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} // namespace of sys
84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} // namespace of mcld
85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
86