Host.inc revision 36b56886974eae4f9c5ebc96befd3e7bfe5de338
12e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor //===- llvm/Support/Unix/Host.inc -------------------------------*- C++ -*-===// 22e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// 32e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// The LLVM Compiler Infrastructure 42e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// 52e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// This file is distributed under the University of Illinois Open Source 62e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// License. See LICENSE.TXT for details. 72e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// 82e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor//===----------------------------------------------------------------------===// 92e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// 102e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// This file implements the UNIX Host support. 112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor// 122e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor//===----------------------------------------------------------------------===// 132e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 142e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor//===----------------------------------------------------------------------===// 152e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor//=== WARNING: Implementation here must contain only generic UNIX code that 162e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor//=== is guaranteed to work on *all* UNIX variants. 17d7a3e2c5f61cd4893f95b69a424fe4def3aa0f69Benjamin Kramer//===----------------------------------------------------------------------===// 18aa49a7d70e58dac2aeb40664ba16d2ea571b8c95Daniel Dunbar 192e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "llvm/Config/config.h" 202e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "llvm/ADT/StringRef.h" 212e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include "Unix.h" 222e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include <sys/utsname.h> 232e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include <cctype> 242e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor#include <string> 259852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer#include <cstdlib> // ::getenv 263e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt 279852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramerusing namespace llvm; 289852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer 29011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattnerstatic std::string getOSVersion() { 302e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor struct utsname info; 31011bb4edf731d529da1cbf71c7c2696aaf5a054fChris Lattner 329852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer if (uname(&info)) 339852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer return ""; 342577743c5650c646fb705df01403707e94f2df04Abramo Bagnara 359852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer return info.release; 369852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer} 379852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramer 389852f58f50b4fc20914fbce5b4454135a42343f4Benjamin Kramerstd::string sys::getDefaultTargetTriple() { 392e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor StringRef TargetTripleString(LLVM_DEFAULT_TARGET_TRIPLE); 402e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor std::pair<StringRef, StringRef> ArchSplit = TargetTripleString.split('-'); 412e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 422e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // Normalize the arch, since the target triple may not actually match the target. 432e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor std::string Arch = ArchSplit.first; 442e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 452e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor std::string Triple(Arch); 462e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Triple += '-'; 472e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Triple += ArchSplit.second; 482e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 492e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // Force i<N>86 to i386. 502e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor if (Triple[0] == 'i' && isdigit(Triple[1]) && 512e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Triple[2] == '8' && Triple[3] == '6') 522e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor Triple[1] = '3'; 532e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 542e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // On darwin, we want to update the version to match that of the 552e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor // target. 56e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor std::string::size_type DarwinDashIdx = Triple.find("-darwin"); 572a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor if (DarwinDashIdx != std::string::npos) { 583e518bda00d710754ca077cf9be8dd821e16a854Sean Hunt Triple.resize(DarwinDashIdx + strlen("-darwin")); 592a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor Triple += getOSVersion(); 602e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor } 612e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor 622e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor return Triple::normalize(Triple); 632e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor} 642e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor