aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-06-16 21:39:33 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-06-16 21:39:33 +0000
commitf2edbf3a5c0595a61c48ab820602a73f779c64b9 (patch)
treee6b8fca8d612b60c0972345782ee930875927290
parentfdd8b8ebf60bf98118731d7fc12c9c96e7f2d95a (diff)
Darwin/Driver: Also look at -arch command line options when finding the default
tool chain. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@73555 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Driver/HostInfo.cpp34
-rw-r--r--test/Driver/default-toolchain.c5
2 files changed, 31 insertions, 8 deletions
diff --git a/lib/Driver/HostInfo.cpp b/lib/Driver/HostInfo.cpp
index 2d577f82fd..daac0cb0b6 100644
--- a/lib/Driver/HostInfo.cpp
+++ b/lib/Driver/HostInfo.cpp
@@ -108,16 +108,34 @@ ToolChain *DarwinHostInfo::getToolChain(const ArgList &Args,
const char *ArchName) const {
std::string Arch;
if (!ArchName) {
- Arch = getArchName();
+ // If we aren't looking for a specific arch, infer the default architecture
+ // based on -arch and -m32/-m64 command line options.
+ if (Arg *A = Args.getLastArg(options::OPT_arch)) {
+ // The gcc driver behavior with multiple -arch flags wasn't consistent for
+ // things which rely on a default architecture. We just use the last -arch
+ // to find the default tool chain.
+ Arch = A->getValue(Args);
+
+ // Normalize arch name; we shouldn't be doing this here.
+ //
+ // FIXME: This should be unnecessary once everything moves over to using
+ // the ID based Triple interface.
+ if (Arch == "ppc")
+ Arch = "powerpc";
+ else if (Arch == "powerpc")
+ Arch = "powerpc64";
+ } else {
+ // Otherwise default to the arch of the host.
+ Arch = getArchName();
+ }
ArchName = Arch.c_str();
-
- // If no arch name is specified, infer it from the host and
- // -m32/-m64.
+
+ // Honor -m32 and -m64 when finding the default tool chain.
if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
- if (getArchName() == "i386" || getArchName() == "x86_64") {
- ArchName =
- (A->getOption().getId() == options::OPT_m32) ? "i386" : "x86_64";
- } else if (getArchName() == "powerpc" || getArchName() == "powerpc64") {
+ if (Arch == "i386" || Arch == "x86_64") {
+ ArchName = (A->getOption().getId() == options::OPT_m32) ? "i386" :
+ "x86_64";
+ } else if (Arch == "powerpc" || Arch == "powerpc64") {
ArchName = (A->getOption().getId() == options::OPT_m32) ? "powerpc" :
"powerpc64";
}
diff --git a/test/Driver/default-toolchain.c b/test/Driver/default-toolchain.c
new file mode 100644
index 0000000000..a9f5cfd3e0
--- /dev/null
+++ b/test/Driver/default-toolchain.c
@@ -0,0 +1,5 @@
+// RUN: clang -ccc-host-triple i386-unknown-unknown -m64 -v 2> %t
+// RUN: grep 'Target: x86_64-unknown-unknown' %t &&
+
+// RUN: clang -ccc-host-triple i386-apple-darwin9 -arch ppc -m64 -v 2> %t
+// RUN: grep 'Target: powerpc64-apple-darwin9' %t