diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2015-05-27 20:26:41 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2015-05-27 20:26:41 +0000 |
commit | ff0cc061ecf297f1556e906d229826fd709f37d6 (patch) | |
tree | bd13a22d9db57ccf3eddbc07b32c18109521d050 /contrib/llvm/tools/llvm-link | |
parent | e14ba20ace4c6ab45aca5130defd992ab7d6bf5f (diff) | |
parent | 5a5ac124e1efaf208671f01c46edb15f29ed2a0b (diff) |
Merge llvm trunk r238337 from ^/vendor/llvm/dist, resolve conflicts, and
preserve our customizations, where necessary.
Notes
Notes:
svn path=/projects/clang-trunk/; revision=283631
Diffstat (limited to 'contrib/llvm/tools/llvm-link')
-rw-r--r-- | contrib/llvm/tools/llvm-link/llvm-link.cpp | 70 |
1 files changed, 55 insertions, 15 deletions
diff --git a/contrib/llvm/tools/llvm-link/llvm-link.cpp b/contrib/llvm/tools/llvm-link/llvm-link.cpp index 828b9bb8ef70..369f3477fe5c 100644 --- a/contrib/llvm/tools/llvm-link/llvm-link.cpp +++ b/contrib/llvm/tools/llvm-link/llvm-link.cpp @@ -13,7 +13,9 @@ //===----------------------------------------------------------------------===// #include "llvm/Linker/Linker.h" +#include "llvm/ADT/STLExtras.h" #include "llvm/Bitcode/ReaderWriter.h" +#include "llvm/IR/AutoUpgrade.h" #include "llvm/IR/DiagnosticInfo.h" #include "llvm/IR/DiagnosticPrinter.h" #include "llvm/IR/LLVMContext.h" @@ -36,6 +38,11 @@ static cl::list<std::string> InputFilenames(cl::Positional, cl::OneOrMore, cl::desc("<input bitcode files>")); +static cl::list<std::string> OverridingInputs( + "override", cl::ZeroOrMore, cl::value_desc("filename"), + cl::desc( + "input bitcode file which can override previously defined symbol(s)")); + static cl::opt<std::string> OutputFilename("o", cl::desc("Override output filename"), cl::init("-"), cl::value_desc("filename")); @@ -57,6 +64,16 @@ static cl::opt<bool> SuppressWarnings("suppress-warnings", cl::desc("Suppress all linking warnings"), cl::init(false)); +static cl::opt<bool> PreserveBitcodeUseListOrder( + "preserve-bc-uselistorder", + cl::desc("Preserve use-list order when writing LLVM bitcode."), + cl::init(true), cl::Hidden); + +static cl::opt<bool> PreserveAssemblyUseListOrder( + "preserve-ll-uselistorder", + cl::desc("Preserve use-list order when writing LLVM assembly."), + cl::init(false), cl::Hidden); + // Read the specified bitcode file in and return it. This routine searches the // link path for the specified file to try to find it... // @@ -68,6 +85,9 @@ loadFile(const char *argv0, const std::string &FN, LLVMContext &Context) { if (!Result) Err.print(argv0, errs()); + Result->materializeMetadata(); + UpgradeDebugInfo(*Result); + return Result; } @@ -92,6 +112,31 @@ static void diagnosticHandler(const DiagnosticInfo &DI) { errs() << '\n'; } +static bool linkFiles(const char *argv0, LLVMContext &Context, Linker &L, + const cl::list<std::string> &Files, + bool OverrideDuplicateSymbols) { + for (const auto &File : Files) { + std::unique_ptr<Module> M = loadFile(argv0, File, Context); + if (!M.get()) { + errs() << argv0 << ": error loading file '" << File << "'\n"; + return false; + } + + if (verifyModule(*M, &errs())) { + errs() << argv0 << ": " << File << ": error: input module is broken!\n"; + return false; + } + + if (Verbose) + errs() << "Linking in '" << File << "'\n"; + + if (L.linkInModule(M.get(), OverrideDuplicateSymbols)) + return false; + } + + return true; +} + int main(int argc, char **argv) { // Print a stack trace if we signal out. sys::PrintStackTraceOnErrorSignal(); @@ -104,18 +149,13 @@ int main(int argc, char **argv) { auto Composite = make_unique<Module>("llvm-link", Context); Linker L(Composite.get(), diagnosticHandler); - for (unsigned i = 0; i < InputFilenames.size(); ++i) { - std::unique_ptr<Module> M = loadFile(argv[0], InputFilenames[i], Context); - if (!M.get()) { - errs() << argv[0] << ": error loading file '" <<InputFilenames[i]<< "'\n"; - return 1; - } - - if (Verbose) errs() << "Linking in '" << InputFilenames[i] << "'\n"; + // First add all the regular input files + if (!linkFiles(argv[0], Context, L, InputFilenames, false)) + return 1; - if (L.linkInModule(M.get())) - return 1; - } + // Next the -override ones. + if (!linkFiles(argv[0], Context, L, OverridingInputs, true)) + return 1; if (DumpAsm) errs() << "Here's the assembly:\n" << *Composite; @@ -126,16 +166,16 @@ int main(int argc, char **argv) { return 1; } - if (verifyModule(*Composite)) { - errs() << argv[0] << ": linked module is broken!\n"; + if (verifyModule(*Composite, &errs())) { + errs() << argv[0] << ": error: linked module is broken!\n"; return 1; } if (Verbose) errs() << "Writing bitcode...\n"; if (OutputAssembly) { - Out.os() << *Composite; + Composite->print(Out.os(), nullptr, PreserveAssemblyUseListOrder); } else if (Force || !CheckBitcodeOutputToConsole(Out.os(), true)) - WriteBitcodeToFile(Composite.get(), Out.os()); + WriteBitcodeToFile(Composite.get(), Out.os(), PreserveBitcodeUseListOrder); // Declare success. Out.keep(); |