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