For PR780:
1. Add #includes to LinkAllVMCore.h to get Mangler.o and InlineAsm.o
2. Make Mangler.h and InlineAsm.h use the macros to ensure linkage
3. Make each of the tools with --load options include LinkAllVMCore.h
This should be the last set of changes for this bug and 800.

llvm-svn: 28719
diff --git a/llvm/include/llvm/InlineAsm.h b/llvm/include/llvm/InlineAsm.h
index 9777498..6e7aab1 100644
--- a/llvm/include/llvm/InlineAsm.h
+++ b/llvm/include/llvm/InlineAsm.h
@@ -17,6 +17,7 @@
 #define LLVM_INLINEASM_H
 
 #include "llvm/Value.h"
+#include "llvm/Support/IncludeFile.h"
 #include <vector>
 
 namespace llvm {
@@ -35,7 +36,7 @@
   
   InlineAsm(const FunctionType *Ty, const std::string &AsmString,
             const std::string &Constraints, bool hasSideEffects);
-  ~InlineAsm();
+  virtual ~InlineAsm();
 public:
 
   /// InlineAsm::get - Return the the specified uniqued inline asm string.
@@ -128,4 +129,7 @@
 
 } // End llvm namespace
 
+// Make sure the InlineAsm.cpp file is linked when this one is #included.
+FORCE_DEFINING_FILE_TO_BE_LINKED(InlineAsm)
+
 #endif
diff --git a/llvm/include/llvm/LinkAllVMCore.h b/llvm/include/llvm/LinkAllVMCore.h
index fa7c399..d0366eb 100644
--- a/llvm/include/llvm/LinkAllVMCore.h
+++ b/llvm/include/llvm/LinkAllVMCore.h
@@ -17,9 +17,11 @@
 #define LLVM_LINKALLVMCORE_H
 
 #include "llvm/Support/IncludeFile.h"
+#include "llvm/Support/Mangler.h"
 #include "llvm/Module.h"
 #include "llvm/Instructions.h"
 #include "llvm/IntrinsicInst.h"
+#include "llvm/InlineAsm.h"
 #include "llvm/Analysis/Verifier.h"
 
 namespace {
diff --git a/llvm/include/llvm/Support/Mangler.h b/llvm/include/llvm/Support/Mangler.h
index 30a48a8..50e49ff 100644
--- a/llvm/include/llvm/Support/Mangler.h
+++ b/llvm/include/llvm/Support/Mangler.h
@@ -14,6 +14,7 @@
 #ifndef LLVM_SUPPORT_MANGLER_H
 #define LLVM_SUPPORT_MANGLER_H
 
+#include "llvm/Support/IncludeFile.h"
 #include <map>
 #include <set>
 #include <string>
@@ -103,4 +104,7 @@
 
 } // End llvm namespace
 
+// Force the Mangler.cpp file to be linked when this header is #included
+FORCE_DEFINING_FILE_TO_BE_LINKED(Mangler)
+
 #endif // LLVM_SUPPORT_MANGLER_H
diff --git a/llvm/lib/VMCore/InlineAsm.cpp b/llvm/lib/VMCore/InlineAsm.cpp
index 0f82064..5f05137 100644
--- a/llvm/lib/VMCore/InlineAsm.cpp
+++ b/llvm/lib/VMCore/InlineAsm.cpp
@@ -208,3 +208,5 @@
   if (Ty->getNumParams() != NumInputs) return false;
   return true;
 }
+
+DEFINING_FILE_FOR(InlineAsm)
diff --git a/llvm/lib/VMCore/Mangler.cpp b/llvm/lib/VMCore/Mangler.cpp
index b1a9e3a..53719af 100644
--- a/llvm/lib/VMCore/Mangler.cpp
+++ b/llvm/lib/VMCore/Mangler.cpp
@@ -200,3 +200,6 @@
   for (Module::global_iterator I = M.global_begin(), E = M.global_end(); I != E; ++I)
     InsertName(I, Names);
 }
+
+// Cause this file to be linked in when Support/Mangler.h is #included
+DEFINING_FILE_FOR(Mangler)
diff --git a/llvm/tools/analyze/analyze.cpp b/llvm/tools/analyze/analyze.cpp
index 71ae657..c3411ab 100644
--- a/llvm/tools/analyze/analyze.cpp
+++ b/llvm/tools/analyze/analyze.cpp
@@ -27,6 +27,7 @@
 #include "llvm/System/Signals.h"
 #include "llvm/Support/PluginLoader.h"
 #include "llvm/Support/Timer.h"
+#include "llvm/LinkAllVMCore.h"
 #include <algorithm>
 
 using namespace llvm;
diff --git a/llvm/tools/llc/llc.cpp b/llvm/tools/llc/llc.cpp
index 6a66e52..f57f3e1 100644
--- a/llvm/tools/llc/llc.cpp
+++ b/llvm/tools/llc/llc.cpp
@@ -28,6 +28,7 @@
 #include "llvm/Analysis/Verifier.h"
 #include "llvm/System/Signals.h"
 #include "llvm/Config/config.h"
+#include "llvm/LinkAllVMCore.h"
 #include <fstream>
 #include <iostream>
 #include <memory>
diff --git a/llvm/tools/llvm-db/llvm-db.cpp b/llvm/tools/llvm-db/llvm-db.cpp
index a46aa08..b270535 100644
--- a/llvm/tools/llvm-db/llvm-db.cpp
+++ b/llvm/tools/llvm-db/llvm-db.cpp
@@ -16,6 +16,7 @@
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/PluginLoader.h"
 #include "llvm/System/Signals.h"
+#include "llvm/LinkAllVMCore.h"
 #include <iostream>
 
 using namespace llvm;
diff --git a/llvm/tools/llvm-ld/llvm-ld.cpp b/llvm/tools/llvm-ld/llvm-ld.cpp
index 1900cc9..b93d511 100644
--- a/llvm/tools/llvm-ld/llvm-ld.cpp
+++ b/llvm/tools/llvm-ld/llvm-ld.cpp
@@ -20,6 +20,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "llvm/LinkAllVMCore.h"
 #include "llvm/Linker.h"
 #include "llvm/System/Program.h"
 #include "llvm/Module.h"
@@ -77,9 +78,12 @@
   cl::desc("Disable writing of compressed bytecode files"));
 
 static cl::list<std::string> PostLinkOpts("post-link-opts",
-  cl::value_desc("path to post-link optimization programs"),
+  cl::value_desc("path"),
   cl::desc("Run one or more optimization programs after linking"));
 
+static cl::list<std::string> XLinker("Xlinker", cl::value_desc("option"),
+  cl::desc("Pass options to the system linker"));
+
 // Compatibility options that are ignored but supported by LD
 static cl::opt<std::string> CO3("soname", cl::Hidden,
   cl::desc("Compatibility option: ignored"));
@@ -93,6 +97,7 @@
 static  cl::opt<std::string> CO6("h", cl::Hidden,
   cl::desc("Compatibility option: ignored"));
 
+
 /// This is just for convenience so it doesn't have to be passed around
 /// everywhere.
 static std::string progname;
@@ -303,12 +308,25 @@
   args.push_back(OutputFilename.c_str());
   args.push_back(InputFilename.c_str());
 
+  // Add in the library paths
+  for (unsigned index = 0; index < LibPaths.size(); index++) {
+    args.push_back("-L");
+    args.push_back(LibPaths[index].c_str());
+  }
+
+  // Add the requested options
+  for (unsigned index = 0; index < XLinker.size(); index++) {
+    args.push_back(XLinker[index].c_str());
+    args.push_back(Libraries[index].c_str());
+  }
+
   // Add in the libraries to link.
   for (unsigned index = 0; index < Libraries.size(); index++)
     if (Libraries[index] != "crtend") {
       args.push_back("-l");
       args.push_back(Libraries[index].c_str());
     }
+
   args.push_back(0);
 
   // Run the compiler to assembly and link together the program.
diff --git a/llvm/tools/opt/opt.cpp b/llvm/tools/opt/opt.cpp
index b6ededd..9fddd94 100644
--- a/llvm/tools/opt/opt.cpp
+++ b/llvm/tools/opt/opt.cpp
@@ -25,6 +25,7 @@
 #include "llvm/Support/PluginLoader.h"
 #include "llvm/Support/SystemUtils.h"
 #include "llvm/Transforms/LinkAllPasses.h"
+#include "llvm/LinkAllVMCore.h"
 #include <fstream>
 #include <memory>
 #include <algorithm>