Path::get -> Path::toString
[oota-llvm.git] / tools / llvm-link / llvm-link.cpp
index 4fe8637482c539b5604188867ecf438cf4e76bfb..1fcbf336e66c682a369d259e9f75e4ff1035452b 100644 (file)
 //
 //===----------------------------------------------------------------------===//
 
+#include "llvm/Linker.h"
 #include "llvm/Module.h"
 #include "llvm/Analysis/Verifier.h"
 #include "llvm/Bytecode/Reader.h"
 #include "llvm/Bytecode/Writer.h"
-#include "llvm/Transforms/Utils/Linker.h"
-#include "Support/CommandLine.h"
-#include "Support/FileUtilities.h"
-#include "Support/Signals.h"
+#include "llvm/Support/CommandLine.h"
+#include "llvm/System/Signals.h"
+#include "llvm/System/Path.h"
 #include <fstream>
+#include <iostream>
 #include <memory>
 
 using namespace llvm;
@@ -41,71 +42,73 @@ Verbose("v", cl::desc("Print information about actions taken"));
 static cl::opt<bool>
 DumpAsm("d", cl::desc("Print assembly as linked"), cl::Hidden);
 
-static cl::list<std::string>
-LibPaths("L", cl::desc("Specify a library search path"), cl::ZeroOrMore,
-         cl::value_desc("directory"), cl::Prefix);
+static cl::opt<bool> NoCompress("disable-compression", cl::init(false),
+       cl::desc("Don't ompress the generated bytecode"));
 
 // LoadFile - Read the specified bytecode file in and return it.  This routine
 // searches the link path for the specified file to try to find it...
 //
 static inline std::auto_ptr<Module> LoadFile(const std::string &FN) {
-  std::string Filename = FN;
-  std::string ErrorMessage;
-
-  unsigned NextLibPathIdx = 0;
-  bool FoundAFile = false;
+  sys::Path Filename;
+  if (!Filename.setFile(FN)) {
+    std::cerr << "Invalid file name: '" << FN << "'\n";
+    return std::auto_ptr<Module>();
+  }
 
-  while (1) {
-    if (Verbose) std::cerr << "Loading '" << Filename << "'\n";
-    if (getFileSize(Filename) != -1) FoundAFile = true;
-    Module *Result = ParseBytecodeFile(Filename, &ErrorMessage);
+  std::string ErrorMessage;
+  if (Filename.exists()) {
+    if (Verbose) std::cerr << "Loading '" << Filename.c_str() << "'\n";
+    Module* Result = ParseBytecodeFile(Filename.toString(), &ErrorMessage);
     if (Result) return std::auto_ptr<Module>(Result);   // Load successful!
 
     if (Verbose) {
-      std::cerr << "Error opening bytecode file: '" << Filename << "'";
+      std::cerr << "Error opening bytecode file: '" << Filename.c_str() << "'";
       if (ErrorMessage.size()) std::cerr << ": " << ErrorMessage;
       std::cerr << "\n";
     }
-    
-    if (NextLibPathIdx == LibPaths.size()) break;
-    Filename = LibPaths[NextLibPathIdx++] + "/" + FN;
+  } else {
+    std::cerr << "Bytecode file: '" << Filename.c_str() 
+              << "' does not exist.\n";
   }
 
-  if (FoundAFile)
-    std::cerr << "Bytecode file '" << FN << "' corrupt!  "
-              << "Use 'llvm-link -v ...' for more info.\n";
-  else
-    std::cerr << "Could not locate bytecode file: '" << FN << "'\n";
   return std::auto_ptr<Module>();
 }
 
-
-
-
 int main(int argc, char **argv) {
   cl::ParseCommandLineOptions(argc, argv, " llvm linker\n");
-  PrintStackTraceOnErrorSignal();
+  sys::PrintStackTraceOnErrorSignal();
   assert(InputFilenames.size() > 0 && "OneOrMore is not working");
 
   unsigned BaseArg = 0;
   std::string ErrorMessage;
 
   std::auto_ptr<Module> Composite(LoadFile(InputFilenames[BaseArg]));
-  if (Composite.get() == 0) return 1;
+  if (Composite.get() == 0) {
+    std::cerr << argv[0] << ": error loading file '"
+              << InputFilenames[BaseArg] << "'\n";
+    return 1;
+  }
 
   for (unsigned i = BaseArg+1; i < InputFilenames.size(); ++i) {
     std::auto_ptr<Module> M(LoadFile(InputFilenames[i]));
-    if (M.get() == 0) return 1;
+    if (M.get() == 0) {
+      std::cerr << argv[0] << ": error loading file '"
+                << InputFilenames[i] << "'\n";
+      return 1;
+    }
 
     if (Verbose) std::cerr << "Linking in '" << InputFilenames[i] << "'\n";
 
     if (LinkModules(Composite.get(), M.get(), &ErrorMessage)) {
-      std::cerr << argv[0] << ": error linking in '" << InputFilenames[i]
+      std::cerr << argv[0] << ": link error in '" << InputFilenames[i]
                 << "': " << ErrorMessage << "\n";
       return 1;
     }
   }
 
+  // TODO: Iterate over the -l list and link in any modules containing
+  // global symbols that have not been resolved so far.
+
   if (DumpAsm) std::cerr << "Here's the assembly:\n" << Composite.get();
 
   std::ostream *Out = &std::cout;  // Default to printing to stdout...
@@ -125,7 +128,7 @@ int main(int argc, char **argv) {
 
     // Make sure that the Out file gets unlinked from the disk if we get a
     // SIGINT
-    RemoveFileOnSignal(OutputFilename);
+    sys::RemoveFileOnSignal(sys::Path(OutputFilename));
   }
 
   if (verifyModule(*Composite.get())) {
@@ -134,7 +137,7 @@ int main(int argc, char **argv) {
   }
 
   if (Verbose) std::cerr << "Writing bytecode...\n";
-  WriteBytecodeToFile(Composite.get(), *Out);
+  WriteBytecodeToFile(Composite.get(), *Out, !NoCompress);
 
   if (Out != &std::cout) delete Out;
   return 0;