Host.inc revision 221345
1 //===- llvm/Support/Unix/Host.inc -------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file implements the UNIX Host support. 11// 12//===----------------------------------------------------------------------===// 13 14//===----------------------------------------------------------------------===// 15//=== WARNING: Implementation here must contain only generic UNIX code that 16//=== is guaranteed to work on *all* UNIX variants. 17//===----------------------------------------------------------------------===// 18 19#include "llvm/Config/config.h" 20#include "llvm/ADT/StringRef.h" 21#include "Unix.h" 22#include <sys/utsname.h> 23#include <cctype> 24#include <string> 25 26using namespace llvm; 27 28static std::string getOSVersion() { 29 struct utsname info; 30 31 if (uname(&info)) 32 return ""; 33 34 return info.release; 35} 36 37std::string sys::getHostTriple() { 38 // FIXME: Derive directly instead of relying on the autoconf generated 39 // variable. 40 41 StringRef HostTripleString(LLVM_HOSTTRIPLE); 42 std::pair<StringRef, StringRef> ArchSplit = HostTripleString.split('-'); 43 44 // Normalize the arch, since the host triple may not actually match the host. 45 std::string Arch = ArchSplit.first; 46 47 // It would be nice to do this in terms of llvm::Triple, but that is in 48 // Support which is layered above us. 49#if defined(__x86_64__) 50 Arch = "x86_64"; 51#elif defined(__i386__) 52 Arch = "i386"; 53#elif defined(__ppc64__) 54 Arch = "powerpc64"; 55#elif defined(__ppc__) 56 Arch = "powerpc"; 57#elif defined(__arm__) 58 59 // FIXME: We need to pick the right ARM triple (which involves querying the 60 // chip). However, for now this is most important for LLVM arch selection, so 61 // we only need to make sure to distinguish ARM and Thumb. 62# if defined(__thumb__) 63 Arch = "thumb"; 64# else 65 Arch = "arm"; 66# endif 67 68#else 69 70 // FIXME: When enough auto-detection is in place, this should just 71 // #error. Then at least the arch selection is done, and we only need the OS 72 // etc selection to kill off the use of LLVM_HOSTTRIPLE. 73 74#endif 75 76 std::string Triple(Arch); 77 Triple += '-'; 78 Triple += ArchSplit.second; 79 80 // Force i<N>86 to i386. 81 if (Triple[0] == 'i' && isdigit(Triple[1]) && 82 Triple[2] == '8' && Triple[3] == '6') 83 Triple[1] = '3'; 84 85 // On darwin, we want to update the version to match that of the 86 // host. 87 std::string::size_type DarwinDashIdx = Triple.find("-darwin"); 88 if (DarwinDashIdx != std::string::npos) { 89 Triple.resize(DarwinDashIdx + strlen("-darwin")); 90 Triple += getOSVersion(); 91 } 92 93 return Triple; 94} 95