diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-09-03 01:10:13 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-09-03 01:10:13 +0000 |
commit | 1e48cf651240e745819e2cbf5cd837b4c24141b1 (patch) | |
tree | 1098ee5ba49b60379b3e8281b71c0269c91cf214 | |
parent | fe15ce4a51f0d83bd2a0bb788af70663fc8713aa (diff) | |
download | external_llvm-1e48cf651240e745819e2cbf5cd837b4c24141b1.zip external_llvm-1e48cf651240e745819e2cbf5cd837b4c24141b1.tar.gz external_llvm-1e48cf651240e745819e2cbf5cd837b4c24141b1.tar.bz2 |
Improve llvm::getHostTriple for some cases where the LLVM_HOSTTRIPLE is not
reliable.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@80863 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/System/Unix/Host.inc | 46 |
1 files changed, 42 insertions, 4 deletions
diff --git a/lib/System/Unix/Host.inc b/lib/System/Unix/Host.inc index fb319fd..c76d6a4 100644 --- a/lib/System/Unix/Host.inc +++ b/lib/System/Unix/Host.inc @@ -16,7 +16,8 @@ //=== is guaranteed to work on *all* UNIX variants. //===----------------------------------------------------------------------===// -#include <llvm/Config/config.h> +#include "llvm/Config/config.h" +#include "llvm/ADT/StringRef.h" #include "Unix.h" #include <sys/utsname.h> #include <string> @@ -33,10 +34,47 @@ static std::string getOSVersion() { } std::string sys::getHostTriple() { - // FIXME: Derive more directly instead of relying on the autoconf - // generated variable. + // FIXME: Derive directly instead of relying on the autoconf generated + // variable. - std::string Triple = LLVM_HOSTTRIPLE; + StringRef HostTripleString(LLVM_HOSTTRIPLE); + std::pair<StringRef, StringRef> ArchSplit = HostTripleString.split('-'); + + // Normalize the arch, since the host triple may not actually match the host. + std::string Arch = ArchSplit.first; + + // It would be nice to do this in terms of llvm::Triple, but that is in + // Support which is layered above us. +#if defined(__x86_64__) + Arch = "x86_64"; +#elif defined(__i386__) + Arch = "i386"; +#elif defined(__ppc64__) + Arch = "powerpc64"; +#elif defined(__ppc__) + Arch = "powerpc"; +#elif defined(__arm__) + + // FIXME: We need to pick the right ARM triple (which involves querying the + // chip). However, for now this is most important for LLVM arch selection, so + // we only need to make sure to distinguish ARM and Thumb. +# if defined(__thumb__) + Arch = "thumb"; +# else + Arch = "arm"; +# endif + +#else + + // FIXME: When enough auto-detection is in place, this should just + // #error. Then at least the arch selection is done, and we only need the OS + // etc selection to kill off the use of LLVM_HOSTTRIPLE. + +#endif + + std::string Triple(Arch); + Triple += '-'; + Triple += ArchSplit.second; // Force i<N>86 to i386. if (Triple[0] == 'i' && isdigit(Triple[1]) && |