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::getDefaultTargetTriple() { 39 StringRef TargetTripleString(LLVM_DEFAULT_TARGET_TRIPLE); 40 std::pair<StringRef, StringRef> ArchSplit = TargetTripleString.split('-'); 41 42 // Normalize the arch, since the target triple may not actually match the target. 43 std::string Arch = ArchSplit.first; 44 45 std::string Triple(Arch); 46 Triple += '-'; 47 Triple += ArchSplit.second; 48 49 // Force i<N>86 to i386. 50 if (Triple[0] == 'i' && isdigit(Triple[1]) && 51 Triple[2] == '8' && Triple[3] == '6') 52 Triple[1] = '3'; 53 54 // On darwin, we want to update the version to match that of the 55 // target. 56 std::string::size_type DarwinDashIdx = Triple.find("-darwin"); 57 if (DarwinDashIdx != std::string::npos) { 58 Triple.resize(DarwinDashIdx + strlen("-darwin")); 59 Triple += getOSVersion(); 60 } 61 62 return Triple::normalize(Triple); 63} 64