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#include <cstdlib> // ::getenv 26 27using namespace llvm; 28 29static std::string getOSVersion() { 30 struct utsname info; 31 32 if (uname(&info)) 33 return ""; 34 35 return info.release; 36} 37 38std::string sys::getHostTriple() { 39 // FIXME: Derive directly instead of relying on the autoconf generated 40 // variable. 41 42 StringRef HostTripleString(LLVM_HOSTTRIPLE); 43 std::pair<StringRef, StringRef> ArchSplit = HostTripleString.split('-'); 44 45 // Normalize the arch, since the host triple may not actually match the host. 46 std::string Arch = ArchSplit.first; 47 48 std::string Triple(Arch); 49 Triple += '-'; 50 Triple += ArchSplit.second; 51 52 // Force i<N>86 to i386. 53 if (Triple[0] == 'i' && isdigit(Triple[1]) && 54 Triple[2] == '8' && Triple[3] == '6') 55 Triple[1] = '3'; 56 57 // On darwin, we want to update the version to match that of the 58 // host. 59 std::string::size_type DarwinDashIdx = Triple.find("-darwin"); 60 if (DarwinDashIdx != std::string::npos) { 61 Triple.resize(DarwinDashIdx + strlen("-darwin")); 62 Triple += getOSVersion(); 63 } 64 65 return Triple; 66} 67