]> granicus.if.org Git - clang/commitdiff
Driver: Add host info.
authorDaniel Dunbar <daniel@zuster.org>
Tue, 10 Mar 2009 23:41:59 +0000 (23:41 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Tue, 10 Mar 2009 23:41:59 +0000 (23:41 +0000)
 - Replace assorted -ccc-host-* options by -ccc-host-triple which is
   more sane.

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

include/clang/Driver/Driver.h
lib/Driver/Driver.cpp
tools/driver/driver.cpp

index 61ec5498d695fb32eb995c00ba22fc2a1a9c46e7..38451c66b15cc6838975c8e91ed598f01fa6074a 100644 (file)
@@ -38,6 +38,9 @@ public:
   /// The path the driver executable was in, as invoked from the
   /// command line.
   std::string Dir;
+  
+  /// Default host triple.
+  std::string DefaultHostTriple;
 
   /// Host information for the platform the driver is running as. This
   /// will generally be the actual host platform, but not always.
@@ -73,7 +76,8 @@ public:
   std::list<std::string> ResultFiles;
 
 public:
-  Driver(const char *_Name, const char *_Dir);
+  Driver(const char *_Name, const char *_Dir,
+         const char *_DefaultHostTriple);
   ~Driver();
 
   
@@ -85,6 +89,10 @@ public:
 
   /// PrintOptions - Print the given list of arguments.
   void PrintOptions(const ArgList *Args);
+
+  /// GetHostInfo - Construct a new host info object for the given
+  /// host triple.
+  static HostInfo *GetHostInfo(const char *HostTriple);
 };
 
 } // end namespace driver
index 6b1d44e5e75592e166ba14b40e06c583fedce312..4b29ae394cf84d716851b321b9bcd8b6efb69dab 100644 (file)
 #include "clang/Driver/Arg.h"
 #include "clang/Driver/ArgList.h"
 #include "clang/Driver/Compilation.h"
+#include "clang/Driver/HostInfo.h"
 #include "clang/Driver/Option.h"
 #include "clang/Driver/Options.h"
 
 #include "llvm/Support/raw_ostream.h"
 using namespace clang::driver;
 
-Driver::Driver(const char *_Name, const char *_Dir) 
+Driver::Driver(const char *_Name, const char *_Dir,
+               const char *_DefaultHostTriple) 
   : Opts(new OptTable()),
-    Name(_Name), Dir(_Dir), Host(0),
+    Name(_Name), Dir(_Dir), DefaultHostTriple(_DefaultHostTriple),
+    Host(0),
     CCCIsCXX(false), CCCEcho(false), 
     CCCNoClang(false), CCCNoClangCXX(false), CCCNoClangCPP(false)
 {
@@ -53,6 +56,7 @@ Compilation *Driver::BuildCompilation(int argc, const char **argv) {
   bool CCCPrintOptions = false, CCCPrintPhases = false;
 
   const char **Start = argv + 1, **End = argv + argc;
+  const char *HostTriple = DefaultHostTriple.c_str();
 
   // Read -ccc args. 
   //
@@ -94,18 +98,9 @@ Compilation *Driver::BuildCompilation(int argc, const char **argv) {
         }
       }
 
-    } else if (!strcmp(Opt, "host-bits")) {
+    } else if (!strcmp(Opt, "host-triple")) {
       assert(Start+1 < End && "FIXME: -ccc- argument handling.");
-      HostBits = *++Start;
-    } else if (!strcmp(Opt, "host-machine")) {
-      assert(Start+1 < End && "FIXME: -ccc- argument handling.");
-      HostMachine = *++Start;
-    } else if (!strcmp(Opt, "host-release")) {
-      assert(Start+1 < End && "FIXME: -ccc- argument handling.");
-      HostRelease = *++Start;
-    } else if (!strcmp(Opt, "host-system")) {
-      assert(Start+1 < End && "FIXME: -ccc- argument handling.");
-      HostSystem = *++Start;
+      HostTriple = *++Start;
 
     } else {
       // FIXME: Error handling.
@@ -113,7 +108,9 @@ Compilation *Driver::BuildCompilation(int argc, const char **argv) {
       exit(1);
     }
   }
-  
+
+  Host = Driver::GetHostInfo(HostTriple);
+
   ArgList *Args = ParseArgStrings(Start, End);
 
   // FIXME: This behavior shouldn't be here.
@@ -121,7 +118,7 @@ Compilation *Driver::BuildCompilation(int argc, const char **argv) {
     PrintOptions(Args);
     exit(0);
   }
-
+  
   assert(0 && "FIXME: Implement");
 
   return new Compilation();
@@ -143,3 +140,26 @@ void Driver::PrintOptions(const ArgList *Args) {
     llvm::errs() << "}\n";
   }
 }
+
+HostInfo *Driver::GetHostInfo(const char *Triple) {
+  // Dice into arch, platform, and OS. This matches 
+  //  arch,platform,os = '(.*?)-(.*?)-(.*?)'
+  // and missing fields are left empty.
+  std::string Arch, Platform, OS;
+
+  if (const char *ArchEnd = strchr(Triple, '-')) {
+    Arch = std::string(Triple, ArchEnd);
+
+    if (const char *PlatformEnd = strchr(ArchEnd+1, '-')) {
+      Platform = std::string(ArchEnd+1, PlatformEnd);
+      OS = PlatformEnd+1;
+    } else
+      Platform = ArchEnd+1;
+  } else
+    Arch = Triple;
+
+  if (memcmp(&Platform[0], "darwin", 6) == 0)
+    return new DarwinHostInfo(Arch.c_str(), Platform.c_str(), OS.c_str());
+    
+  return new UnknownHostInfo(Arch.c_str(), Platform.c_str(), OS.c_str());
+}
index ad6c807327214c4105963bd32c4f1084c759bc45..b9e94b28131d58e6db7edd9682581c1e7e127f31 100644 (file)
@@ -18,6 +18,7 @@
 #include "clang/Driver/Options.h"
 
 #include "llvm/ADT/OwningPtr.h"
+#include "llvm/Config/config.h"
 #include "llvm/System/Path.h"
 #include "llvm/System/Signals.h"
 using namespace clang::driver;
@@ -30,8 +31,11 @@ int main(int argc, const char **argv) {
   // is that the path derived from this will influence search paths.
   llvm::sys::Path Path(argv[0]);
 
+  // FIXME: Use the triple of the host, not the triple that we were
+  // compiled on.
   llvm::OwningPtr<Driver> TheDriver(new Driver(Path.getBasename().c_str(),
-                                               Path.getDirname().c_str()));
+                                               Path.getDirname().c_str(),
+                                               LLVM_HOSTTRIPLE));
 
   llvm::OwningPtr<Compilation> C(TheDriver->BuildCompilation(argc, argv));