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 27 using namespace llvm; 28 29 static std::string getOSVersion() { 30 struct utsname info; 31 32 if (uname(&info)) 33 return ""; 34 35 return info.release; 36 } 37 38 std::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; 63 } 64