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