]> granicus.if.org Git - clang/commitdiff
Darwin/Driver: Also look at -arch command line options when finding the default
authorDaniel Dunbar <daniel@zuster.org>
Tue, 16 Jun 2009 21:39:33 +0000 (21:39 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Tue, 16 Jun 2009 21:39:33 +0000 (21:39 +0000)
tool chain.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@73555 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Driver/HostInfo.cpp
test/Driver/default-toolchain.c [new file with mode: 0644]

index 2d577f82fd40b46198b75a27766a7ee8001231be..daac0cb0b6465ca57ac9fa5184048c47574ff883 100644 (file)
@@ -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 (file)
index 0000000..a9f5cfd
--- /dev/null
@@ -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