Revert "Revert "New implementation of llvm-rs-cc (replacement of slang_driver).""

This reverts commit a6d60672695f1438a63acdbf85eae7f97ce2b50d.
diff --git a/slang.h b/slang.h
index 03a0c86..67f8560 100644
--- a/slang.h
+++ b/slang.h
@@ -40,8 +40,6 @@
 
   static bool GlobalInitialized;
 
-  static void GlobalInitialization();
-
   static void LLVMErrorHandler(void *UserData, const std::string &Message);
 
  public:
@@ -67,7 +65,8 @@
   // The target being compiled for
   clang::TargetOptions mTargetOpts;
   llvm::OwningPtr<clang::TargetInfo> mTarget;
-  void createTarget(const char *Triple, const char *CPU, const char **Features);
+  void createTarget(const std::string &Triple, const std::string &CPU,
+                    const std::vector<std::string> &Features);
 
   // Below is for parsing and code generation
 
@@ -93,9 +92,10 @@
   // Input file name
   std::string mInputFileName;
   std::string mOutputFileName;
+
   std::string mDepOutputFileName;
   std::string mDepTargetBCFileName;
-  std::string mAdditionalDepTargetFileName;
+  std::vector<std::string> mAdditionalDepTargets;
 
   OutputType mOT;
 
@@ -133,7 +133,10 @@
 
   static const llvm::StringRef PragmaMetadataName;
 
-  Slang(const char *Triple, const char *CPU, const char **Features);
+  static void GlobalInitialization();
+
+  Slang(const std::string &Triple, const std::string &CPU,
+        const std::vector<std::string> &Features);
 
   bool setInputSource(llvm::StringRef InputFile, const char *Text,
                       size_t TextLength);
@@ -142,8 +145,8 @@
 
   inline const std::string &getInputFileName() const { return mInputFileName; }
 
-  inline void addIncludePath(const char *Path) {
-    mIncludePaths.push_back(Path);
+  inline void setIncludePaths(const std::vector<std::string> &IncludePaths) {
+    mIncludePaths = IncludePaths;
   }
 
   inline void setOutputType(OutputType OT) { mOT = OT; }
@@ -154,8 +157,13 @@
   }
 
   bool setDepOutput(const char *OutputFile);
-  bool setDepTargetBC(const char *TargetBCFile);
-  bool setAdditionalDepTarget(const char* AdditionalDepTargetFileName);
+  inline void setDepTargetBC(const char *TargetBCFile) {
+    mDepTargetBCFileName = TargetBCFile;
+  }
+  inline void setAdditionalDepTargets(
+      const std::vector<std::string> &AdditionalDepTargets) {
+    mAdditionalDepTargets = AdditionalDepTargets;
+  }
 
   int generateDepFile();
   int compile();