[llvm-commits] CVS: llvm/lib/VMCore/Linker.cpp

Reid Spencer reid at x10sys.com
Fri Sep 10 23:25:27 CDT 2004



Changes in directory llvm/lib/VMCore:

Linker.cpp updated: 1.84 -> 1.85
---
Log message:

Implement support for dependent libraries. The "source" module's dependent
libraries list is merged into the "destination" module's list. Also, if the
source module is one of the dependent libraries, it is removed from the
list.


---
Diffs of the changes:  (+21 -0)

Index: llvm/lib/VMCore/Linker.cpp
diff -u llvm/lib/VMCore/Linker.cpp:1.84 llvm/lib/VMCore/Linker.cpp:1.85
--- llvm/lib/VMCore/Linker.cpp:1.84	Fri Aug 20 19:50:59 2004
+++ llvm/lib/VMCore/Linker.cpp	Fri Sep 10 23:25:17 2004
@@ -23,6 +23,7 @@
 #include "llvm/SymbolTable.h"
 #include "llvm/Instructions.h"
 #include "llvm/Assembly/Writer.h"
+#include "llvm/System/Path.h"
 #include <iostream>
 #include <sstream>
 using namespace llvm;
@@ -835,6 +836,9 @@
 // shouldn't be relied on to be consistent.
 //
 bool llvm::LinkModules(Module *Dest, const Module *Src, std::string *ErrorMsg) {
+  assert(Dest != 0 && "Invalid Destination module");
+  assert(Src  != 0 && "Invalid Source Module");
+
   if (Dest->getEndianness() == Module::AnyEndianness)
     Dest->setEndianness(Src->getEndianness());
   if (Dest->getPointerSize() == Module::AnyPointerSize)
@@ -847,6 +851,16 @@
       Dest->getPointerSize() != Src->getPointerSize())
     std::cerr << "WARNING: Linking two modules of different pointer size!\n";
 
+  // Update the destination module's dependent libraries list with the libraries 
+  // from the source module. There's no opportunity for duplicates here as the
+  // Module ensures that duplicate insertions are discarded.
+  Module::lib_iterator SI = Src->lib_begin();
+  Module::lib_iterator SE = Src->lib_end();
+  while ( SI != SE ) {
+    Dest->addLibrary(*SI);
+    ++SI;
+  }
+
   // LinkTypes - Go through the symbol table of the Src module and see if any
   // types are named in the src module that are not named in the Dst module.
   // Make sure there are no type name conflicts.
@@ -915,6 +929,13 @@
   //
   if (LinkAppendingVars(Dest, AppendingVars, ErrorMsg)) return true;
 
+  // If the source library's module id is in the dependent library list of the
+  // destination library, remove it since that module is now linked in.
+  sys::Path modId;
+  modId.set_file(Src->getModuleIdentifier());
+  if (!modId.is_empty())
+    Dest->removeLibrary(modId.get_basename());
+
   return false;
 }
 






More information about the llvm-commits mailing list